Skip to content

Feat/UI v2.0 - #3

Merged
alichherawalla merged 11 commits into
mainfrom
feat/ui-v2.0
Feb 7, 2026
Merged

alichherawalla merged 11 commits into
mainfrom
feat/ui-v2.0

Conversation

@alichherawalla

Copy link
Copy Markdown
Collaborator

No description provided.

- Document brutalist design philosophy and principles
- Define TYPOGRAPHY scale (display, h1-h3, body, label, meta)
- Define SPACING scale (xs to xxl)
- Define COLORS monochromatic palette with emerald accent
- Document component patterns and usage guidelines
- Add implementation examples for common patterns
- Removed non-existent COLORS.secondary references
- Use COLORS.info (blue) for image/vision features
- Aligns with single emerald accent color design system
- Fixes TypeScript errors for missing secondary color
- Change onDismiss prop to onClose (correct API)
- Fix hideAlert() calls - must be invoked with parentheses
- Update 10+ screens and components with broken CustomAlert
- Ensures alerts properly close when dismissed
- Fixes race condition in alert state management
- Replace hardcoded fontSize/fontWeight with TYPOGRAPHY tokens
- Standardize fontFamily to use FONTS.mono consistently
- Fix 350+ typography violations across 28 files
- Ensures consistent text sizing across all screens
- Changes: fontSize: 14 → ...TYPOGRAPHY.body, etc.
- Removes magic numbers for font styling
- Change screen headers from h1 (24px) to h2 (16px)
- Change section headers from h1/h2 to h3 (13px)
- Add missing color: COLORS.text to ProjectsScreen title
- Fix ModelSelectorModal title (h2 → h3) and close button (h2 → body)
- Fixes overly large header text throughout app
- Improves visual hierarchy and information density
- Replace hardcoded font sizes with TYPOGRAPHY tokens
- Fix border radius consistency (8px)
- Improve visual consistency with design system
- Update tests for onDismiss → onClose prop change
- Update tests for hideAlert() invocation syntax
- Ensures tests pass after CustomAlert API corrections
- Add references to new design system documentation
- Update component usage patterns
- Document brutalist design principles in context
@alichherawalla
alichherawalla merged commit cf89ffa into main Feb 7, 2026
fl4p referenced this pull request in fl4p/off-grid-ai-mobile Jul 3, 2026
…ollision

#3: rewrite saveImageToGallery to use @react-native-camera-roll/camera-roll so
images land in the actual Photos app (iOS) / gallery MediaStore (Android),
user-visible in the system photos app, instead of an app-private Documents
folder on iOS. Android permission is only requested on API < 33 (newer versions
add to the media store without it). iOS Info.plist already carries the
NSPhotoLibraryAdd usage string.

#4: index-scope the non-user image testIDs in MessageAttachments
(generated-image-${index} / generated-image-content-${index}) so an assistant
image and a run_python plot in the same tree no longer collide under
getByTestId. Updates the affected component tests and the image-generation
Maestro flow + E2E docs to the index-scoped ids.

Requires 'pod install' + a rebuild for the new native module.
alichherawalla added a commit that referenced this pull request Jul 6, 2026
- Pre-check now policy-aware (Qodo #4): activeModelService.checkMemoryForModel
  passes the residency manager's active policy into the budget owner, so aggressive
  relaxes the pre-check AND residency consistently (single budget, one policy).
- loadPolicySync is now a singleton (Qodo #3): repeated startLoadPolicySync() calls
  return the same live unsubscribe instead of stacking Zustand subscriptions — App's
  boot effect can re-run without leaking listeners / duplicate setLoadPolicy calls.
- Removed the misleading policyAllowsOverride (Qodo #5): "Load Anyway" is an
  always-available, per-load, user-confirmed escape hatch (its historical behaviour
  and the explicit product ask), NOT gated by the policy. The aggressive setting
  changes the default budget; override is separate. Dropped the false contract
  rather than gating the override away.
- Concretised the toggle copy (Qodo #2): states the actual mechanism (~70%→~88%
  ceiling, 1.5GB→0.8GB reserve, less RAM for other apps) instead of a vague claim.

Tests: aggressive flips the pre-check result end-to-end; loadPolicySync singleton
guard (two starts → one subscription, one setLoadPolicy per flip).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
alichherawalla added a commit that referenced this pull request Sep 6, 2026
The root failure observer early-returned unless the domain was `rag` or `sync`, so every event on
the new `'lifecycle'` domain - `degraded`, `recovered`, `lifecycle_failed` - was dropped on the
floor. Audit 3 P0 #3 requires both apps' observers to RECEIVE the failure rather than depend on
console output; shared's half landed in `924d728` and mobile's was still discarding it.

The filter now routes `'lifecycle'` to its own reporter, and the semantics of Seat C's keyed report
list are honoured rather than flattened:

- `degraded` carries the report that was just recorded or replaced, so it is logged with its
  REPORTER (`source`) and the derived `lifecycleFailure` alongside it.
- `recovered` names the reporter that RETRACTED, not a healthy domain. `degraded` and
  `lifecycleFailure` are two filters over one list keyed by `(scope, source)`, so a retraction
  clears exactly one owner's entry and another owner may still be reporting the same domain -
  there is deliberately no domain-level clear. It is logged as one reporter standing down, and
  whether the DOMAIN is still degraded is READ from the `degraded` projection at event time
  instead of being inferred from the event.
- `lifecycle_failed` is logged with its phase and every cause, in report order.

`reportDegradedStart` stays, and the comment now says why it is not a duplicate: the domains the
app composed no ports for are recorded at construction as `unavailable` reports and emit NO event,
so `result.degraded` is the only place they appear. It is now one summary line instead of one error
per entry, because everything in it that is a real failure has already been reported per event.

Written against shared HEAD's contract. `@offgrid/application`'s dist in mobile predates `924d728`
and has no `'lifecycle'` domain, `ApplicationLifecycleEvent` or `lifecycle_failed` at all, so this
cannot be typechecked or built until the dist is rebuilt - BLOCKERS PRE-1, the same gate already
holding `b65c79fd`, `f396fd7a` and `4eb8e319`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant