@xenide-io/the-old-ui-theme 0.9.18 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/{Chip-BzuNgJIa.d.mts → Chip-Dw2g2t8D.d.mts} +18 -4
  2. package/dist/{Chip-BzuNgJIa.d.ts → Chip-Dw2g2t8D.d.ts} +18 -4
  3. package/dist/{chunk-6SVJAU5K.mjs → chunk-RIPGN6FG.mjs} +1333 -526
  4. package/dist/index.d.mts +3 -2
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.js +490 -119
  7. package/dist/index.mjs +11 -3
  8. package/dist/suite-analytics--Mf1RZbw.d.mts +29 -0
  9. package/dist/suite-analytics--Mf1RZbw.d.ts +29 -0
  10. package/dist/suite.d.mts +36 -4
  11. package/dist/suite.d.ts +36 -4
  12. package/dist/suite.js +4617 -4001
  13. package/dist/suite.mjs +1456 -868
  14. package/dist/tailwind-preset.js +10 -1
  15. package/dist/tailwind-preset.mjs +10 -1
  16. package/dist/ui.d.mts +33 -4
  17. package/dist/ui.d.ts +33 -4
  18. package/dist/ui.js +1364 -571
  19. package/dist/ui.mjs +15 -1
  20. package/docs/macos-identity-audit.md +279 -0
  21. package/package.json +1 -1
  22. package/src/app/globals.css +390 -44
  23. package/src/components/ui/Accordion.tsx +4 -7
  24. package/src/components/ui/Avatar.tsx +5 -5
  25. package/src/components/ui/BrandSpinner.tsx +256 -0
  26. package/src/components/ui/Calendar.tsx +7 -7
  27. package/src/components/ui/CodeBlock.tsx +14 -11
  28. package/src/components/ui/CollapsibleSection.tsx +4 -4
  29. package/src/components/ui/CommandPalette.tsx +7 -10
  30. package/src/components/ui/EmptyState.tsx +2 -2
  31. package/src/components/ui/Input.tsx +1 -1
  32. package/src/components/ui/Marketing.tsx +144 -0
  33. package/src/components/ui/MarketingIllustrations.tsx +287 -0
  34. package/src/components/ui/Panel.tsx +1 -1
  35. package/src/components/ui/SegmentedControl.tsx +59 -13
  36. package/src/components/ui/SettingsLayout.tsx +4 -0
  37. package/src/components/ui/ShowcaseWrapper.tsx +3 -3
  38. package/src/components/ui/Table.tsx +45 -10
  39. package/src/components/ui/Typography.tsx +4 -4
  40. package/src/components/ui/avatar-stat.test.tsx +14 -1
  41. package/src/components/ui/brand-spinner.test.tsx +62 -0
  42. package/src/components/ui/index.ts +19 -11
  43. package/src/components/ui/interaction-primitives.test.tsx +12 -6
  44. package/src/components/ui/marketing.test.tsx +39 -0
  45. package/src/components/ui/table.test.tsx +47 -0
  46. package/src/styles/suite-skin.css +471 -74
  47. package/src/styles/themes.css +45 -45
  48. package/src/styles/typography.css +25 -1
  49. package/src/suite/components/ai-draft-editor.tsx +184 -0
  50. package/src/suite/components/ai-panel-workflows.test.tsx +179 -0
  51. package/src/suite/components/ai-panel.tsx +201 -31
  52. package/src/suite/components/app-switcher.tsx +22 -9
  53. package/src/suite/components/command-palette-host.tsx +20 -2
  54. package/src/suite/components/suite-app-layout.tsx +7 -4
  55. package/src/suite/components/suite-bottom-nav.tsx +1 -1
  56. package/src/suite/components/suite-clients-projects-directory.tsx +6 -6
  57. package/src/suite/components/suite-integration-picker.tsx +7 -7
  58. package/src/suite/components/suite-integration-rules.tsx +5 -5
  59. package/src/suite/components/suite-layout.test.tsx +32 -3
  60. package/src/suite/components/suite-layout.tsx +4 -4
  61. package/src/suite/components/suite-mobile-drawer.tsx +2 -2
  62. package/src/suite/components/suite-mobile-header.tsx +1 -1
  63. package/src/suite/components/suite-notification-bell.tsx +27 -6
  64. package/src/suite/components/suite-notification-settings.tsx +182 -0
  65. package/src/suite/components/suite-palette-library.test.tsx +46 -0
  66. package/src/suite/components/suite-palette-library.tsx +82 -15
  67. package/src/suite/components/suite-settings-layout.tsx +2 -2
  68. package/src/suite/components/suite-settings-mobile-nav.tsx +10 -10
  69. package/src/suite/components/suite-sidebar.test.tsx +39 -0
  70. package/src/suite/components/suite-sidebar.tsx +41 -19
  71. package/src/suite/components/suite-skeleton.tsx +6 -6
  72. package/src/suite/components/suite-user-menu.tsx +2 -2
  73. package/src/suite/components/theme-provider.tsx +2 -0
  74. package/src/suite/components/today-calibrating.tsx +3 -3
  75. package/src/suite/components/today-ui.tsx +42 -37
  76. package/src/suite/components/workspace-switcher.tsx +3 -3
  77. package/src/suite/index.ts +14 -0
  78. package/src/suite/lib/suite-notifications.tsx +5 -0
  79. package/tailwind-preset.ts +9 -0
@@ -68,7 +68,7 @@ export function SourceAppGlyph({
68
68
  <img
69
69
  src={SOURCE_APP_LOGOS[app]}
70
70
  alt=""
71
- className={cn("h-7 w-7 shrink-0 rounded-lg object-contain", className)}
71
+ className={cn("h-7 w-7 shrink-0 rounded-[var(--ph-radius-control)] object-contain", className)}
72
72
  />
73
73
  );
74
74
  }
@@ -210,11 +210,11 @@ export function TodayTopBar({
210
210
  {icon}
211
211
  </div>
212
212
  <div className="flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1">
213
- <h1 className="font-display text-[1.625rem] font-bold leading-tight tracking-tight text-ph-ink sm:text-[2.25rem]">
213
+ <h1 className="ph-page-title font-display font-semibold text-ph-ink">
214
214
  Today
215
215
  </h1>
216
216
  {appName ? (
217
- <span className="rounded-md bg-ph-muted px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-ph-subtle">
217
+ <span className="rounded-[var(--ph-radius-control)] bg-ph-muted px-2 py-0.5 text-[length:var(--ph-type-overline)] font-semibold uppercase tracking-wide text-ph-subtle">
218
218
  {appName}
219
219
  </span>
220
220
  ) : null}
@@ -226,7 +226,7 @@ export function TodayTopBar({
226
226
  type="button"
227
227
  onClick={onRefresh}
228
228
  disabled={refreshing || loading}
229
- className="press-subtle inline-flex h-10 w-10 items-center justify-center rounded-lg text-ph-subtle transition hover:bg-ph-surface hover:text-ph-ink disabled:opacity-50"
229
+ className="ph-btn ph-btn-ghost ph-btn-square press-subtle h-10 w-10 text-ph-subtle"
230
230
  data-test="today-refresh"
231
231
  aria-label="Refresh today"
232
232
  >
@@ -282,28 +282,33 @@ export function TodayHero({
282
282
  message = "Take a nice, deep breath.",
283
283
  brief,
284
284
  briefMeta,
285
+ action,
285
286
  }: {
286
287
  message?: ReactNode;
287
288
  /** AI / local focus brief under the greeting. */
288
289
  brief?: ReactNode;
289
290
  briefMeta?: ReactNode;
291
+ action?: ReactNode;
290
292
  }) {
291
293
  return (
292
- <div className="mt-4 sm:mt-6">
293
- <p
294
- key={typeof message === "string" ? message : "hero"}
295
- className="today-hero max-w-2xl font-display text-lg font-semibold tracking-tight text-ph-ink sm:text-xl sm:leading-snug"
296
- >
297
- {message}
298
- </p>
299
- {brief ? (
300
- <div className="mt-4 max-w-2xl" data-test="today-focus-brief">
301
- <p className="text-[15px] leading-[1.65] text-ph-ink">{brief}</p>
302
- {briefMeta ? (
303
- <p className="mt-1.5 text-xs text-ph-mutedtext">{briefMeta}</p>
304
- ) : null}
305
- </div>
306
- ) : null}
294
+ <div className="flex min-w-0 flex-col gap-5 border-b border-ph-border-subtle pb-6 sm:flex-row sm:items-center sm:justify-between">
295
+ <div className="min-w-0 flex-1">
296
+ <p
297
+ key={typeof message === "string" ? message : "hero"}
298
+ className="today-hero max-w-2xl font-display text-lg font-semibold tracking-tight text-ph-ink sm:text-xl"
299
+ >
300
+ {message}
301
+ </p>
302
+ {brief ? (
303
+ <div className="mt-2 max-w-xl" data-test="today-focus-brief">
304
+ <p className="text-sm leading-relaxed text-ph-subtle">{brief}</p>
305
+ {briefMeta ? (
306
+ <p className="mt-1.5 text-xs text-ph-mutedtext">{briefMeta}</p>
307
+ ) : null}
308
+ </div>
309
+ ) : null}
310
+ </div>
311
+ {action ? <div className="w-full shrink-0 sm:w-72">{action}</div> : null}
307
312
  </div>
308
313
  );
309
314
  }
@@ -340,7 +345,7 @@ export function TodayPrimaryAction({
340
345
  dataTest?: string;
341
346
  }) {
342
347
  const classes = cn(
343
- "today-primary-action group relative flex w-full max-w-md items-center gap-3 overflow-hidden rounded-xl px-3.5 py-2.5 text-left transition sm:px-4 sm:py-3",
348
+ "today-primary-action group relative flex w-full max-w-md items-center gap-3 overflow-hidden rounded-[var(--ph-radius-surface)] px-3.5 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:shadow-[var(--ph-focus-halo)] sm:px-4 sm:py-3",
344
349
  `today-primary-action--${accent}`,
345
350
  active && "today-primary-action--active",
346
351
  loading && "pointer-events-none opacity-70",
@@ -349,7 +354,7 @@ export function TodayPrimaryAction({
349
354
 
350
355
  const body = (
351
356
  <>
352
- <span className="today-primary-action__icon inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg sm:h-10 sm:w-10">
357
+ <span className="today-primary-action__icon inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--ph-radius-control)] sm:h-10 sm:w-10">
353
358
  {icon}
354
359
  </span>
355
360
  <span className="min-w-0 flex-1">
@@ -363,7 +368,7 @@ export function TodayPrimaryAction({
363
368
  ) : null}
364
369
  </span>
365
370
  <span
366
- className="today-primary-action__chevron shrink-0 text-base opacity-60 transition group-hover:translate-x-0.5 group-hover:opacity-100"
371
+ className="today-primary-action__chevron shrink-0 text-base opacity-60 transition-[transform,opacity] group-hover:translate-x-0.5 group-hover:opacity-100"
367
372
  aria-hidden
368
373
  >
369
374
  →
@@ -415,12 +420,12 @@ export function TodayEmptyAction({
415
420
  }) {
416
421
  return (
417
422
  <div
418
- className="rounded-lg border border-dashed border-ph-border/80 bg-ph-muted/30 px-4 py-4 text-center"
423
+ className="rounded-[var(--ph-radius-surface)] border border-ph-border-subtle bg-ph-surface px-5 py-6 text-left"
419
424
  data-test={dataTest}
420
425
  >
421
426
  <p className="text-sm font-semibold text-ph-ink">{title}</p>
422
427
  {description ? (
423
- <p className="mx-auto mt-1 max-w-sm text-xs leading-relaxed text-ph-subtle sm:text-sm">
428
+ <p className="mt-1.5 max-w-md text-sm leading-relaxed text-ph-subtle">
424
429
  {description}
425
430
  </p>
426
431
  ) : null}
@@ -428,7 +433,7 @@ export function TodayEmptyAction({
428
433
  href ? (
429
434
  <a
430
435
  href={href}
431
- className="mt-2.5 inline-flex text-sm font-semibold text-ph-brand hover:underline"
436
+ className="ph-btn ph-btn-link mt-3 text-sm"
432
437
  >
433
438
  {actionLabel}
434
439
  </a>
@@ -436,7 +441,7 @@ export function TodayEmptyAction({
436
441
  <button
437
442
  type="button"
438
443
  onClick={onClick}
439
- className="mt-2.5 inline-flex text-sm font-semibold text-ph-brand hover:underline"
444
+ className="ph-btn ph-btn-link mt-3 text-sm"
440
445
  >
441
446
  {actionLabel}
442
447
  </button>
@@ -446,7 +451,7 @@ export function TodayEmptyAction({
446
451
  );
447
452
  }
448
453
 
449
- /** Desktop Today shell: main column + sticky Ask AI / brief aside. */
454
+ /** Daily work queue and contextual rail; both stay in the page's scroll flow. */
450
455
  export function TodayLayout({
451
456
  primary,
452
457
  main,
@@ -464,10 +469,10 @@ export function TodayLayout({
464
469
  data-test="today-layout"
465
470
  >
466
471
  {primary ? <div className="max-w-md">{primary}</div> : null}
467
- <div className="grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(16rem,20rem)] lg:items-start lg:gap-8">
472
+ <div className={cn("grid gap-8 lg:items-start", aside && "lg:grid-cols-[minmax(0,1fr)_minmax(15rem,19rem)]")}>
468
473
  <div className="min-w-0 space-y-8">{main}</div>
469
474
  {aside ? (
470
- <aside className="space-y-3 lg:sticky lg:top-6 lg:self-start">
475
+ <aside className="min-w-0 space-y-5">
471
476
  {aside}
472
477
  </aside>
473
478
  ) : null}
@@ -496,7 +501,7 @@ export function TodayAskAiCard({
496
501
  href?: string;
497
502
  }) {
498
503
  const classes = cn(
499
- "group flex w-full items-start gap-3.5 rounded-2xl border border-ph-border/70 bg-ph-surface px-4 py-3.5 text-left shadow-[0_1px_12px_-8px_rgba(15,23,42,0.1)] transition hover:border-ph-brand/35 hover:bg-[color-mix(in_oklab,var(--ph-accent)_6%,var(--ph-surface))] sm:px-5",
504
+ "suite-press group flex w-full items-start gap-3.5 rounded-[var(--ph-radius-surface)] border border-ph-border/70 bg-ph-surface px-4 py-3.5 text-left transition-[background-color,border-color,box-shadow] hover:border-ph-brand/35 hover:bg-[var(--ph-surface-hover)] hover:shadow-[var(--ph-shadow-raised)] focus-visible:outline-none focus-visible:shadow-[var(--ph-focus-halo)] sm:px-5",
500
505
  className,
501
506
  );
502
507
 
@@ -570,19 +575,19 @@ export function TodaySection({
570
575
  children: ReactNode;
571
576
  }) {
572
577
  return (
573
- <section data-test={testId} className="space-y-5">
578
+ <section data-test={testId} className="space-y-4">
574
579
  <div className="flex items-start justify-between gap-4">
575
- <div className="flex min-w-0 items-start gap-3.5">
580
+ <div className="flex min-w-0 items-start gap-3">
576
581
  <span
577
582
  className={cn(
578
- "inline-flex h-10 w-10 sm:h-11 sm:w-11 shrink-0 items-center justify-center rounded-2xl shadow-sm ring-1 ring-black/[0.06]",
583
+ "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-[var(--ph-radius-control)]",
579
584
  iconClassName ?? "bg-ph-muted text-ph-ink",
580
585
  )}
581
586
  >
582
- <Icon className="h-5 w-5" aria-hidden />
587
+ <Icon className="h-4 w-4" aria-hidden />
583
588
  </span>
584
589
  <div className="min-w-0 pt-0.5">
585
- <h2 className="font-display text-lg font-bold tracking-tight text-ph-ink">
590
+ <h2 className="font-display text-lg font-semibold tracking-tight text-ph-ink">
586
591
  {title}
587
592
  </h2>
588
593
  {description ? (
@@ -609,7 +614,7 @@ export function TodayPanel({
609
614
  return (
610
615
  <div
611
616
  className={cn(
612
- "border-ph-border/70 rounded-2xl border bg-ph-surface p-5 shadow-[0_1px_16px_-8px_rgba(15,23,42,0.12)] sm:p-5",
617
+ "today-panel rounded-[var(--ph-radius-surface)] border border-ph-border-subtle bg-ph-surface p-5",
613
618
  className,
614
619
  )}
615
620
  >
@@ -626,7 +631,7 @@ export function TodayEmptyState({
626
631
  description?: string;
627
632
  }) {
628
633
  return (
629
- <div className="border-ph-border/80 rounded-xl border border-dashed px-5 py-8 text-center">
634
+ <div className="rounded-[var(--ph-radius-surface)] border border-dashed border-ph-border/80 bg-[var(--ph-surface-inset)] px-5 py-8 text-center">
630
635
  <p className="text-sm font-semibold text-ph-ink">{title}</p>
631
636
  {description ? (
632
637
  <p className="mt-1.5 text-sm leading-relaxed text-ph-subtle">
@@ -77,9 +77,9 @@ export function SuiteWorkspaceSwitcher({
77
77
  trigger={
78
78
  <span
79
79
  className={cn(
80
- "flex min-w-0 max-w-full items-center gap-2 rounded-lg border border-ph-border bg-ph-muted text-left transition-colors hover:bg-ph-muted",
80
+ "flex min-w-0 max-w-full items-center gap-2 rounded-[var(--ph-radius-control)] border border-ph-border bg-[var(--ph-surface-inset)] text-left transition-colors hover:bg-[var(--ph-surface-hover)]",
81
81
  collapsed ? "h-10 w-10 justify-center p-0" : "w-full px-3 py-2",
82
- open && "border-ph-brand/40",
82
+ open && "border-[var(--ph-selected-border)] bg-[var(--ph-selected-bg)]",
83
83
  )}
84
84
  data-test="workspace-switcher-trigger"
85
85
  >
@@ -111,7 +111,7 @@ export function SuiteWorkspaceSwitcher({
111
111
  ) : (
112
112
  sections.map((section) => (
113
113
  <div key={section.id}>
114
- <p className="px-3 py-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-ph-mutedtext">
114
+ <p className="px-3 py-2 text-[length:var(--ph-type-overline)] font-semibold uppercase tracking-[0.08em] text-ph-mutedtext">
115
115
  {section.label}
116
116
  </p>
117
117
  {section.workspaces.map((workspace) => (
@@ -11,6 +11,12 @@ export {
11
11
  type SuiteAppSelectOptions,
12
12
  } from "./components/app-switcher";
13
13
  export { SuiteNotificationBell } from "./components/suite-notification-bell";
14
+ export {
15
+ SuiteNotificationSettings,
16
+ type SuiteWebPushController,
17
+ type SuiteWebPushState,
18
+ type SuiteNotificationSettingsProps,
19
+ } from "./components/suite-notification-settings";
14
20
  export {
15
21
  SuiteNotificationsProvider,
16
22
  useSuiteNotifications,
@@ -78,6 +84,7 @@ export {
78
84
  type SuiteAiChatMessage,
79
85
  type SuiteAskAiOpenDetail,
80
86
  } from "./components/ai-panel";
87
+ export { SuiteAiDraftEditor, suiteAiDraftFields } from "./components/ai-draft-editor";
81
88
  export {
82
89
  SuiteWorkspaceSwitcher,
83
90
  type SuiteWorkspaceEntry,
@@ -193,3 +200,10 @@ export {
193
200
  type PaletteIcon,
194
201
  type PaletteLibrary,
195
202
  } from "./lib/palette-api";
203
+ export {
204
+ SUITE_ANALYTICS_EVENT,
205
+ subscribeSuiteAnalytics,
206
+ trackSuiteEvent,
207
+ type SuiteAnalyticsEventDetail,
208
+ type SuiteAnalyticsProperties,
209
+ } from "../lib/suite-analytics";
@@ -11,6 +11,7 @@ import {
11
11
  } from "react";
12
12
  import { useRouter } from "next/navigation";
13
13
 
14
+ import { trackSuiteEvent } from "../../lib/suite-analytics";
14
15
  import {
15
16
  resolveSuiteNotificationHref,
16
17
  suiteAppBaseUrl,
@@ -209,6 +210,10 @@ export function SuiteNotificationsProvider({
209
210
  suiteAppBaseUrl("shellstack"),
210
211
  );
211
212
  launchUrl.searchParams.set("next", path);
213
+ trackSuiteEvent("Cross-App Switch", {
214
+ target_app: sourceApp,
215
+ success: true,
216
+ });
212
217
  window.location.assign(launchUrl.toString());
213
218
  return;
214
219
  }
@@ -23,6 +23,15 @@ const posthogThemePreset: Partial<Config> = {
23
23
  ],
24
24
  mono: ["var(--ph-font-monospace-stack)"],
25
25
  shortcut: ["var(--ph-font-shortcut-stack)"],
26
+ display: ["var(--ph-font-sans-stack)"],
27
+ },
28
+ fontSize: {
29
+ xs: ["var(--ph-type-meta)", { lineHeight: "var(--ph-leading-ui)" }],
30
+ sm: ["var(--ph-type-small)", { lineHeight: "var(--ph-leading-ui)" }],
31
+ base: ["var(--ph-type-body)", { lineHeight: "var(--ph-leading-body)" }],
32
+ lg: ["var(--ph-type-card)", { lineHeight: "1.4" }],
33
+ xl: ["var(--ph-type-subsection)", { lineHeight: "1.35" }],
34
+ "2xl": ["var(--ph-type-product-section)", { lineHeight: "1.25" }],
26
35
  },
27
36
  borderRadius: {
28
37
  lemon: "var(--ph-radius-app)",