@xenide-io/the-old-ui-theme 0.9.18 → 0.10.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 (69) hide show
  1. package/dist/{Chip-BzuNgJIa.d.mts → Chip-DKT-82Lf.d.mts} +5 -3
  2. package/dist/{Chip-BzuNgJIa.d.ts → Chip-DKT-82Lf.d.ts} +5 -3
  3. package/dist/{chunk-6SVJAU5K.mjs → chunk-LHE4ROON.mjs} +977 -521
  4. package/dist/index.d.mts +2 -2
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js +138 -99
  7. package/dist/index.mjs +1 -1
  8. package/dist/suite.d.mts +23 -1
  9. package/dist/suite.d.ts +23 -1
  10. package/dist/suite.js +4248 -4039
  11. package/dist/suite.mjs +1006 -793
  12. package/dist/tailwind-preset.js +10 -1
  13. package/dist/tailwind-preset.mjs +10 -1
  14. package/dist/ui.d.mts +33 -4
  15. package/dist/ui.d.ts +33 -4
  16. package/dist/ui.js +1024 -566
  17. package/dist/ui.mjs +13 -1
  18. package/docs/macos-identity-audit.md +279 -0
  19. package/package.json +1 -1
  20. package/src/app/globals.css +334 -44
  21. package/src/components/ui/Accordion.tsx +4 -7
  22. package/src/components/ui/Avatar.tsx +5 -5
  23. package/src/components/ui/Calendar.tsx +7 -7
  24. package/src/components/ui/CodeBlock.tsx +3 -10
  25. package/src/components/ui/CollapsibleSection.tsx +4 -4
  26. package/src/components/ui/CommandPalette.tsx +7 -10
  27. package/src/components/ui/EmptyState.tsx +2 -2
  28. package/src/components/ui/Input.tsx +1 -1
  29. package/src/components/ui/Marketing.tsx +128 -0
  30. package/src/components/ui/MarketingIllustrations.tsx +287 -0
  31. package/src/components/ui/Panel.tsx +1 -1
  32. package/src/components/ui/SegmentedControl.tsx +59 -13
  33. package/src/components/ui/ShowcaseWrapper.tsx +3 -3
  34. package/src/components/ui/Table.tsx +18 -6
  35. package/src/components/ui/Typography.tsx +4 -4
  36. package/src/components/ui/avatar-stat.test.tsx +14 -1
  37. package/src/components/ui/index.ts +13 -12
  38. package/src/components/ui/interaction-primitives.test.tsx +12 -6
  39. package/src/components/ui/marketing.test.tsx +39 -0
  40. package/src/components/ui/table.test.tsx +20 -0
  41. package/src/styles/suite-skin.css +405 -40
  42. package/src/styles/themes.css +45 -45
  43. package/src/styles/typography.css +25 -1
  44. package/src/suite/components/ai-panel.tsx +17 -17
  45. package/src/suite/components/app-switcher.tsx +9 -9
  46. package/src/suite/components/suite-app-layout.tsx +7 -4
  47. package/src/suite/components/suite-bottom-nav.tsx +1 -1
  48. package/src/suite/components/suite-clients-projects-directory.tsx +6 -6
  49. package/src/suite/components/suite-integration-picker.tsx +7 -7
  50. package/src/suite/components/suite-integration-rules.tsx +5 -5
  51. package/src/suite/components/suite-layout.test.tsx +32 -3
  52. package/src/suite/components/suite-layout.tsx +4 -4
  53. package/src/suite/components/suite-mobile-drawer.tsx +2 -2
  54. package/src/suite/components/suite-mobile-header.tsx +1 -1
  55. package/src/suite/components/suite-notification-bell.tsx +4 -4
  56. package/src/suite/components/suite-notification-settings.tsx +171 -0
  57. package/src/suite/components/suite-palette-library.test.tsx +46 -0
  58. package/src/suite/components/suite-palette-library.tsx +82 -15
  59. package/src/suite/components/suite-settings-layout.tsx +2 -2
  60. package/src/suite/components/suite-settings-mobile-nav.tsx +5 -9
  61. package/src/suite/components/suite-sidebar.test.tsx +39 -0
  62. package/src/suite/components/suite-sidebar.tsx +41 -19
  63. package/src/suite/components/suite-skeleton.tsx +6 -6
  64. package/src/suite/components/suite-user-menu.tsx +2 -2
  65. package/src/suite/components/today-calibrating.tsx +3 -3
  66. package/src/suite/components/today-ui.tsx +12 -12
  67. package/src/suite/components/workspace-switcher.tsx +3 -3
  68. package/src/suite/index.ts +6 -0
  69. package/tailwind-preset.ts +9 -0
@@ -41,11 +41,11 @@ html {
41
41
  --suite-reading-max: 48rem; /* ~max-w-3xl / 65ch */
42
42
  }
43
43
 
44
- /* Phones/tablets only: pan/scroll, no pinch-zoom of the page. Desktop zoom stays. */
44
+ /* Phones/tablets retain native pan and pinch zoom. */
45
45
  @media (hover: none) and (pointer: coarse) {
46
46
  html,
47
47
  body {
48
- touch-action: pan-x pan-y;
48
+ touch-action: pan-x pan-y pinch-zoom;
49
49
  }
50
50
  }
51
51
 
@@ -62,6 +62,292 @@ body {
62
62
  }
63
63
 
64
64
  /* Shared app canvas. Dense workspaces do not paint a decorative background. */
65
+ /* One centred marketing header and one button face across the product family. */
66
+ .marketing-header {
67
+ position: sticky;
68
+ top: 0;
69
+ z-index: 50;
70
+ border-bottom: 1px solid var(--ph-border-subtle);
71
+ background: color-mix(in oklab, var(--ph-canvas) 88%, transparent);
72
+ -webkit-backdrop-filter: blur(16px) saturate(1.15);
73
+ backdrop-filter: blur(16px) saturate(1.15);
74
+ }
75
+ @supports not (backdrop-filter: blur(1px)) {
76
+ .marketing-header {
77
+ background: var(--ph-canvas);
78
+ }
79
+ }
80
+ .marketing-header__inner {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ gap: 1rem;
85
+ max-width: 80rem;
86
+ min-height: 4.5rem;
87
+ margin-inline: auto;
88
+ padding-inline: 1.25rem;
89
+ }
90
+ .marketing-header__brand {
91
+ min-width: 0;
92
+ }
93
+ .marketing-header__brand > a {
94
+ display: inline-flex;
95
+ min-height: 2.75rem;
96
+ align-items: center;
97
+ gap: 0.625rem;
98
+ font-size: 1.125rem;
99
+ font-weight: 700;
100
+ color: var(--ph-text-primary);
101
+ border-radius: var(--ph-radius-control);
102
+ }
103
+ .marketing-header__navigation {
104
+ display: none;
105
+ align-items: center;
106
+ gap: 0.25rem;
107
+ }
108
+ .marketing-header__navigation > a {
109
+ display: inline-flex;
110
+ min-height: 2.75rem;
111
+ align-items: center;
112
+ gap: 0.375rem;
113
+ padding-inline: 0.5rem;
114
+ font-size: 0.875rem;
115
+ font-weight: 500;
116
+ color: var(--ph-text-secondary);
117
+ border-radius: var(--ph-radius-control);
118
+ transition:
119
+ color var(--ph-motion-fast) ease,
120
+ background-color var(--ph-motion-fast) ease;
121
+ }
122
+ .marketing-header__navigation > a:hover {
123
+ color: var(--ph-text-primary);
124
+ background: var(--ph-surface-hover);
125
+ }
126
+ .marketing-header__brand > a:focus-visible,
127
+ .marketing-header__navigation > a:focus-visible {
128
+ outline: none;
129
+ box-shadow: var(--ph-focus-halo);
130
+ }
131
+ .marketing-header__navigation svg {
132
+ width: 0.875rem;
133
+ height: 0.875rem;
134
+ flex-shrink: 0;
135
+ }
136
+ .marketing-header__actions {
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: flex-end;
140
+ gap: 0.625rem;
141
+ }
142
+ .marketing-button.ph-btn {
143
+ --ph-btn-control-size: 2.75rem;
144
+ min-height: 2.75rem;
145
+ padding: 0;
146
+ border: 0;
147
+ background: transparent;
148
+ font-size: 0.875rem;
149
+ }
150
+ .marketing-button.ph-btn .ph-btn-chrome {
151
+ min-height: var(--ph-btn-control-size);
152
+ padding: 0.5rem 0.875rem;
153
+ font-size: inherit;
154
+ }
155
+ .marketing-button.ph-btn-lg {
156
+ --ph-btn-control-size: 3.0625rem;
157
+ font-size: 1rem;
158
+ }
159
+ .marketing-button.ph-btn-lg .ph-btn-chrome {
160
+ padding-inline: 1.25rem;
161
+ }
162
+ .marketing-motion-control {
163
+ display: inline-flex;
164
+ min-height: 2.75rem;
165
+ align-items: center;
166
+ gap: 0.5rem;
167
+ border: 1px solid var(--ph-border-control);
168
+ border-radius: 999px;
169
+ padding: 0.5rem 0.875rem;
170
+ color: var(--ph-text-secondary);
171
+ background: var(--ph-surface-raised);
172
+ box-shadow: var(--ph-chrome-inset-solid-top);
173
+ font-size: 0.75rem;
174
+ cursor: pointer;
175
+ transition:
176
+ color var(--ph-motion-fast) ease,
177
+ background-color var(--ph-motion-fast) ease,
178
+ border-color var(--ph-motion-fast) ease,
179
+ box-shadow var(--ph-motion-fast) ease;
180
+ }
181
+ .marketing-motion-control:hover {
182
+ color: var(--ph-text-primary);
183
+ background: var(--ph-surface-hover);
184
+ }
185
+ .marketing-motion-control[aria-pressed="true"] {
186
+ color: var(--ph-selected-text);
187
+ border-color: var(--ph-selected-border);
188
+ background: var(--ph-selected-bg);
189
+ }
190
+ .marketing-motion-control:focus-visible {
191
+ outline: none;
192
+ box-shadow: var(--ph-focus-halo);
193
+ }
194
+ .marketing-reveal--entered {
195
+ animation: marketing-enter 650ms cubic-bezier(0.16, 1, 0.3, 1) both;
196
+ }
197
+ @keyframes marketing-enter {
198
+ from {
199
+ opacity: 0.35;
200
+ transform: translateY(20px);
201
+ }
202
+ to {
203
+ opacity: 1;
204
+ transform: none;
205
+ }
206
+ }
207
+ .marketing-svg-float {
208
+ animation: marketing-art-float 7s ease-in-out infinite;
209
+ }
210
+ .marketing-svg-thread {
211
+ animation: marketing-art-thread 5s linear infinite;
212
+ }
213
+ .marketing-svg-polished {
214
+ animation: marketing-art-polish 7s ease-in-out infinite;
215
+ transform-box: fill-box;
216
+ transform-origin: center;
217
+ }
218
+ .marketing-svg-spark {
219
+ animation: marketing-art-spark 3.5s ease-in-out infinite;
220
+ transform-box: fill-box;
221
+ transform-origin: center;
222
+ }
223
+ @keyframes marketing-art-float {
224
+ 0%,
225
+ 100% {
226
+ transform: translateY(0);
227
+ }
228
+ 50% {
229
+ transform: translateY(-7px);
230
+ }
231
+ }
232
+ @keyframes marketing-art-thread {
233
+ to {
234
+ stroke-dashoffset: -65;
235
+ }
236
+ }
237
+ @keyframes marketing-art-polish {
238
+ 0%,
239
+ 100% {
240
+ opacity: 1;
241
+ transform: translateY(0);
242
+ }
243
+ 20% {
244
+ opacity: 0.25;
245
+ transform: translateY(6px);
246
+ }
247
+ 45%,
248
+ 80% {
249
+ opacity: 1;
250
+ transform: translateY(0);
251
+ }
252
+ }
253
+ @keyframes marketing-art-spark {
254
+ 0%,
255
+ 100% {
256
+ opacity: 0.45;
257
+ transform: scale(0.85);
258
+ }
259
+ 50% {
260
+ opacity: 1;
261
+ transform: scale(1.1);
262
+ }
263
+ }
264
+ .marketing-landing {
265
+ position: relative;
266
+ isolation: isolate;
267
+ overflow-x: clip;
268
+ }
269
+ .marketing-landing::before {
270
+ content: "";
271
+ position: absolute;
272
+ inset: 5rem 0 auto;
273
+ height: 70rem;
274
+ z-index: -1;
275
+ pointer-events: none;
276
+ background:
277
+ radial-gradient(
278
+ ellipse at 18% 12%,
279
+ color-mix(in oklab, var(--ph-accent) 13%, transparent),
280
+ transparent 48%
281
+ ),
282
+ radial-gradient(
283
+ ellipse at 88% 34%,
284
+ color-mix(in oklab, var(--ph-blue) 11%, transparent),
285
+ transparent 50%
286
+ );
287
+ animation: marketing-atmosphere 18s ease-in-out infinite alternate;
288
+ }
289
+ .landing-art-section {
290
+ background:
291
+ radial-gradient(
292
+ ellipse at 85% 40%,
293
+ color-mix(in oklab, var(--ph-accent) 8%, transparent),
294
+ transparent 65%
295
+ ),
296
+ var(--ph-canvas);
297
+ }
298
+ @keyframes marketing-atmosphere {
299
+ from {
300
+ transform: translateY(-8px) scale(0.98);
301
+ }
302
+ to {
303
+ transform: translateY(12px) scale(1.04);
304
+ }
305
+ }
306
+ html[data-marketing-paused] .marketing-landing svg *,
307
+ html[data-marketing-paused] .marketing-landing::before {
308
+ animation-play-state: paused !important;
309
+ }
310
+ @media (min-width: 640px) {
311
+ .marketing-header__inner {
312
+ padding-inline: 2rem;
313
+ }
314
+ }
315
+ @media (min-width: 1100px) {
316
+ .marketing-header__inner {
317
+ display: grid;
318
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
319
+ }
320
+ .marketing-header__navigation {
321
+ display: flex;
322
+ justify-content: center;
323
+ }
324
+ }
325
+ @media (max-width: 639px) {
326
+ .marketing-header__brand .marketing-brand-name {
327
+ display: none;
328
+ }
329
+ .marketing-header__actions {
330
+ gap: 0.5rem;
331
+ }
332
+ }
333
+ @media (prefers-reduced-motion: reduce) {
334
+ .marketing-reveal--entered {
335
+ animation: none;
336
+ }
337
+ [data-marketing-art] * {
338
+ animation: none !important;
339
+ }
340
+ .marketing-landing svg * {
341
+ animation: none !important;
342
+ }
343
+ .marketing-landing::before {
344
+ animation: none;
345
+ }
346
+ .marketing-motion-control {
347
+ display: none;
348
+ }
349
+ }
350
+
65
351
  .suite-app-layout {
66
352
  background: var(--ph-canvas);
67
353
  }
@@ -81,6 +367,31 @@ body {
81
367
  z-index: 2;
82
368
  }
83
369
 
370
+ .suite-app-layout__sidebar {
371
+ border-color: var(--ph-border-subtle);
372
+ background: var(--ph-surface-inset);
373
+ }
374
+
375
+ .suite-sidebar {
376
+ background: color-mix(in oklab, var(--ph-surface-inset) 94%, transparent);
377
+ -webkit-backdrop-filter: blur(18px) saturate(1.15);
378
+ backdrop-filter: blur(18px) saturate(1.15);
379
+ }
380
+
381
+ .suite-sidebar[data-surface="true"] {
382
+ background: color-mix(in oklab, var(--ph-surface-overlay) 94%, transparent);
383
+ }
384
+
385
+ @supports not (backdrop-filter: blur(1px)) {
386
+ .suite-sidebar {
387
+ background: var(--ph-surface-inset);
388
+ }
389
+
390
+ .suite-sidebar[data-surface="true"] {
391
+ background: var(--ph-surface-overlay);
392
+ }
393
+ }
394
+
84
395
  .suite-app-layout > div {
85
396
  position: relative;
86
397
  z-index: 1;
@@ -91,6 +402,21 @@ body {
91
402
  scrollbar-gutter: stable;
92
403
  }
93
404
 
405
+ .suite-app-layout__main:focus-visible {
406
+ box-shadow: inset 0 0 0 3px
407
+ color-mix(in oklab, var(--ph-focus-ring) 30%, transparent);
408
+ }
409
+
410
+ .suite-sidebar-resize-handle {
411
+ transition: background-color var(--ph-motion-fast) ease;
412
+ }
413
+
414
+ .suite-sidebar-resize-handle:hover,
415
+ .suite-sidebar-resize-handle:focus-visible {
416
+ outline: none;
417
+ background: color-mix(in oklab, var(--ph-focus-ring) 30%, transparent);
418
+ }
419
+
94
420
  @supports not (background: color-mix(in oklab, white, transparent)) {
95
421
  .suite-app-layout__main {
96
422
  background: var(--ph-canvas);
@@ -124,6 +450,25 @@ body {
124
450
  margin-inline: calc(-1 * var(--suite-page-pad-x));
125
451
  padding-inline: var(--suite-page-pad-x);
126
452
  }
453
+
454
+ .suite-settings-mobile-bar {
455
+ background: color-mix(in oklab, var(--ph-canvas) 88%, transparent);
456
+ -webkit-backdrop-filter: blur(12px) saturate(1.2);
457
+ backdrop-filter: blur(12px) saturate(1.2);
458
+ }
459
+
460
+ .suite-settings-sidebar {
461
+ padding: 0.375rem;
462
+ border: 1px solid var(--ph-border-subtle);
463
+ border-radius: var(--ph-radius-surface);
464
+ background: var(--ph-surface-inset);
465
+ }
466
+
467
+ @supports not (backdrop-filter: blur(1px)) {
468
+ .suite-settings-mobile-bar {
469
+ background: var(--ph-canvas);
470
+ }
471
+ }
127
472
  @media (min-width: 640px) {
128
473
  .suite-settings-mobile-nav {
129
474
  margin-inline: calc(-1 * var(--suite-page-pad-x-sm));
@@ -453,29 +798,12 @@ html.dark .today-page-frame__cloud--2 {
453
798
  }
454
799
 
455
800
  /* ── Cards ──────────────────────────────────────────────────────────────
456
- The MASTER spec: 12px radius, resting elevation, hover lift, and a
457
- visible press state. Shadows are mixed from the theme's text colour
458
- so they adapt to light AND dark themes instead of going muddy. */
459
- .ph-card {
460
- border-radius: var(--suite-radius-card, 12px);
461
- border-color: var(--ph-border-subtle);
462
- background: var(--ph-surface-raised);
463
- box-shadow:
464
- 0 1px 2px color-mix(in oklab, var(--ph-text-primary) 6%, transparent),
465
- 0 1px 1px color-mix(in oklab, var(--ph-text-primary) 4%, transparent);
466
- transition:
467
- border-color 160ms cubic-bezier(0.4, 0, 0.2, 1),
468
- box-shadow 160ms cubic-bezier(0.4, 0, 0.2, 1),
469
- transform 160ms cubic-bezier(0.4, 0, 0.2, 1);
470
- }
471
-
801
+ Static cards stay flat. Only explicit interactive cards lift. */
472
802
  .ph-card-interactive:hover,
473
803
  a:hover > .ph-card,
474
804
  button:hover > .ph-card {
475
805
  border-color: var(--ph-border-control);
476
- box-shadow:
477
- 0 2px 4px color-mix(in oklab, var(--ph-text-primary) 7%, transparent),
478
- 0 8px 20px color-mix(in oklab, var(--ph-text-primary) 8%, transparent);
806
+ box-shadow: var(--ph-shadow-raised);
479
807
  transform: translateY(-1px);
480
808
  }
481
809
 
@@ -492,12 +820,6 @@ button:hover > .ph-card {
492
820
  transition-duration: 80ms;
493
821
  }
494
822
 
495
- /* Radix focuses the first menu item on open. The menu's highlighted state is
496
- sufficient feedback, so do not retain an app-wide focus ring on that row. */
497
- #app-switcher-menu .ph-dropdown-item:focus-visible {
498
- box-shadow: none;
499
- }
500
-
501
823
  /* ── App bar (mobile) / top bar (desktop) ───────────────────────────────
502
824
  Translucent, blurred, content scrolls beneath — like every native
503
825
  shell. Colour-mix keeps it on-theme in both modes. */
@@ -563,8 +885,9 @@ button:hover > .ph-card {
563
885
  content: "";
564
886
  position: absolute;
565
887
  inset: 0 5px;
566
- border-radius: 0.9rem;
567
- background: var(--ph-accent-highlight-secondary);
888
+ border: 1px solid var(--ph-selected-border);
889
+ border-radius: var(--ph-radius-surface);
890
+ background: var(--ph-selected-bg);
568
891
  }
569
892
  .suite-bottom-nav__icon {
570
893
  transition: color 160ms ease-out;
@@ -604,11 +927,16 @@ button:hover > .ph-card {
604
927
  padding: 0 !important;
605
928
  }
606
929
  .ph-modal-panel {
930
+ left: 0 !important;
931
+ right: 0 !important;
932
+ top: auto !important;
933
+ bottom: 0 !important;
607
934
  width: 100% !important;
608
935
  max-width: 100% !important;
609
936
  margin: 0 !important;
610
937
  max-height: calc(100svh - 3rem) !important;
611
938
  border-radius: 16px 16px 0 0 !important;
939
+ transform: none !important;
612
940
  padding-bottom: env(safe-area-inset-bottom);
613
941
  }
614
942
  /* Grabber — first in-flow child, so it sits above flush header rows. */
@@ -650,6 +978,25 @@ button:hover > .ph-card {
650
978
  -webkit-overflow-scrolling: touch;
651
979
  }
652
980
 
981
+ .suite-ai-composer {
982
+ border-color: var(--ph-border-control);
983
+ border-radius: var(--ph-radius-surface);
984
+ box-shadow:
985
+ var(--ph-chrome-inset-face-top),
986
+ var(--ph-chrome-inset-face-bottom);
987
+ transition:
988
+ border-color var(--ph-motion-fast) ease,
989
+ box-shadow var(--ph-motion-fast) ease;
990
+ }
991
+
992
+ .suite-ai-composer:focus-within {
993
+ border-color: color-mix(in oklab, var(--ph-focus-ring) 58%, var(--ph-border));
994
+ box-shadow:
995
+ var(--ph-focus-halo),
996
+ var(--ph-chrome-inset-face-top),
997
+ var(--ph-chrome-inset-face-bottom);
998
+ }
999
+
653
1000
  /* Compact desktop controls keep their density; coarse pointers get a reliable
654
1001
  44px hit area without app-specific overrides. */
655
1002
  @media (pointer: coarse) {
@@ -670,7 +1017,7 @@ button:hover > .ph-card {
670
1017
  padding: 0;
671
1018
  color: var(--ph-text-primary);
672
1019
  font-family: inherit;
673
- font-size: 0.875rem;
1020
+ font-size: var(--ph-type-small);
674
1021
  line-height: 1.6;
675
1022
  overflow-wrap: anywhere;
676
1023
  }
@@ -690,10 +1037,16 @@ button:hover > .ph-card {
690
1037
  letter-spacing: -0.012em;
691
1038
  line-height: 1.2;
692
1039
  }
693
- .suite-ai-markdown h1 { font-size: 1.2rem; }
694
- .suite-ai-markdown h2 { font-size: 1.05rem; }
1040
+ .suite-ai-markdown h1 {
1041
+ font-size: 1.2rem;
1042
+ }
1043
+ .suite-ai-markdown h2 {
1044
+ font-size: 1.05rem;
1045
+ }
695
1046
  .suite-ai-markdown h3,
696
- .suite-ai-markdown h4 { font-size: 0.9375rem; }
1047
+ .suite-ai-markdown h4 {
1048
+ font-size: 0.9375rem;
1049
+ }
697
1050
  .suite-ai-markdown p,
698
1051
  .suite-ai-markdown ul,
699
1052
  .suite-ai-markdown ol,
@@ -713,18 +1066,29 @@ button:hover > .ph-card {
713
1066
  .suite-ai-markdown ol {
714
1067
  padding-left: 1.375rem;
715
1068
  }
716
- .suite-ai-markdown ul { list-style: disc; }
717
- .suite-ai-markdown ol { list-style: decimal; }
718
- .suite-ai-markdown li { padding-left: 0.125rem; }
719
- .suite-ai-markdown li + li { margin-top: 0.25rem; }
720
- .suite-ai-markdown li::marker { color: var(--ph-brand); }
1069
+ .suite-ai-markdown ul {
1070
+ list-style: disc;
1071
+ }
1072
+ .suite-ai-markdown ol {
1073
+ list-style: decimal;
1074
+ }
1075
+ .suite-ai-markdown li {
1076
+ padding-left: 0.125rem;
1077
+ }
1078
+ .suite-ai-markdown li + li {
1079
+ margin-top: 0.25rem;
1080
+ }
1081
+ .suite-ai-markdown li::marker {
1082
+ color: var(--ph-brand);
1083
+ }
721
1084
  .suite-ai-markdown pre {
722
1085
  padding: 0.75rem;
723
1086
  overflow-x: auto;
724
1087
  border: 1px solid var(--ph-border-subtle);
725
1088
  border-radius: 0.625rem;
726
1089
  background: color-mix(in oklab, var(--ph-surface) 80%, var(--ph-canvas));
727
- box-shadow: inset 0 1px 0 color-mix(in oklab, var(--ph-text-primary) 4%, transparent);
1090
+ box-shadow: inset 0 1px 0
1091
+ color-mix(in oklab, var(--ph-text-primary) 4%, transparent);
728
1092
  }
729
1093
  .suite-ai-markdown code {
730
1094
  font-family: var(--ph-font-monospace-stack, ui-monospace, monospace);
@@ -785,7 +1149,8 @@ button:hover > .ph-card {
785
1149
  .suite-ai-markdown a {
786
1150
  color: var(--ph-brand);
787
1151
  font-weight: 600;
788
- text-decoration: underline solid color-mix(in oklab, currentColor 45%, transparent);
1152
+ text-decoration: underline solid
1153
+ color-mix(in oklab, currentColor 45%, transparent);
789
1154
  text-underline-offset: 0.16em;
790
1155
  }
791
1156
  .suite-ai-markdown a:hover {
@@ -87,55 +87,55 @@
87
87
  [data-theme="hedgehog-dark"] {
88
88
  color-scheme: dark;
89
89
 
90
- /* Microsoft Copilot-style dark UI: neutral graphite surfaces, blue accent. */
91
- --ph-canvas: hsl(240 7% 6%);
92
- --ph-surface: hsl(240 6% 10%);
93
- --ph-muted: hsl(240 5% 13%);
94
- --ph-toolbar: hsl(240 5% 15%);
95
- --ph-surface-inset: hsl(240 7% 7%);
96
- --ph-surface-raised: hsl(240 5% 13%);
97
- --ph-surface-overlay: hsl(240 5% 14%);
98
- --ph-border: hsl(240 5% 21%);
99
- --ph-border-subtle: hsl(240 5% 15%);
100
- --ph-border-strong: hsl(240 4% 36%);
101
-
102
- --ph-text-primary: hsl(240 8% 94%);
103
- --ph-text-secondary: hsl(240 5% 78%);
104
- --ph-text-tertiary: hsl(240 4% 58%);
105
-
106
- --ph-accent: #0084e8;
107
- --ph-accent-hover: #106ebe;
108
- --ph-blue: #00bcf2;
109
- --ph-violet: #b146c2;
110
- --ph-purple: #b146c2;
111
-
112
- --ph-success: #6bb700;
113
- --ph-warning: #ffb900;
114
- --ph-danger: #d13438;
115
- --ph-info: #00bcf2;
116
- --ph-on-accent: #111111;
90
+ /* Warm graphite keeps the Hedgehog pair recognisable after dark. */
91
+ --ph-canvas: hsl(36 8% 7%);
92
+ --ph-surface: hsl(34 7% 10%);
93
+ --ph-muted: hsl(32 7% 13%);
94
+ --ph-toolbar: hsl(30 7% 16%);
95
+ --ph-surface-inset: hsl(36 8% 6%);
96
+ --ph-surface-raised: hsl(32 7% 14%);
97
+ --ph-surface-overlay: hsl(30 7% 16%);
98
+ --ph-border: hsl(31 6% 22%);
99
+ --ph-border-subtle: hsl(32 6% 17%);
100
+ --ph-border-strong: hsl(30 5% 38%);
101
+
102
+ --ph-text-primary: hsl(40 18% 94%);
103
+ --ph-text-secondary: hsl(36 10% 76%);
104
+ --ph-text-tertiary: hsl(34 7% 59%);
105
+
106
+ --ph-accent: #e8682a;
107
+ --ph-accent-hover: #f27b3d;
108
+ --ph-blue: #5b9cff;
109
+ --ph-violet: #b66ce0;
110
+ --ph-purple: #b66ce0;
111
+
112
+ --ph-success: #63b77b;
113
+ --ph-warning: #e6ad48;
114
+ --ph-danger: #df625c;
115
+ --ph-info: #5b9cff;
116
+ --ph-on-accent: #1a0e08;
117
117
  --ph-on-violet: #ffffff;
118
118
  --ph-on-success: #111114;
119
119
  --ph-on-warning: #111114;
120
120
  --ph-on-danger: #ffffff;
121
- --ph-on-info: #111114;
122
- --ph-focus-ring: #4ca3f5;
123
- --ph-selected-bg: #0078d426;
124
- --ph-selected-text: #4ca3f5;
125
- --ph-selected-border: #0078d4;
126
-
127
- --ph-text-3000: hsl(240 8% 94%);
128
- --ph-primary-button-face: #0078d4;
129
- --ph-primary-button-border: #0078d4;
130
- --ph-primary-button-border-hover: #106ebe;
131
- --ph-primary-frame-bg: #0078d4;
132
- --ph-secondary-button-bg: hsl(240 5% 15%);
133
- --ph-secondary-frame-bg: hsl(240 5% 18%);
134
- --ph-secondary-button-border: hsl(240 4% 30%);
135
- --ph-secondary-button-border-hover: hsl(240 4% 40%);
136
-
137
- --ph-border-3000: hsl(240 5% 18%);
138
- --ph-accent-highlight-secondary: #0078d424;
121
+ --ph-on-info: #101725;
122
+ --ph-focus-ring: #66a5ff;
123
+ --ph-selected-bg: hsl(19 72% 17%);
124
+ --ph-selected-text: hsl(22 92% 76%);
125
+ --ph-selected-border: hsl(19 66% 48%);
126
+
127
+ --ph-text-3000: #1a0e08;
128
+ --ph-primary-button-face: #ef8a4c;
129
+ --ph-primary-button-border: #c75a24;
130
+ --ph-primary-button-border-hover: #e8682a;
131
+ --ph-primary-frame-bg: #883714;
132
+ --ph-secondary-button-bg: hsl(30 7% 16%);
133
+ --ph-secondary-frame-bg: hsl(30 7% 20%);
134
+ --ph-secondary-button-border: hsl(30 5% 31%);
135
+ --ph-secondary-button-border-hover: hsl(30 5% 44%);
136
+
137
+ --ph-border-3000: hsl(30 7% 18%);
138
+ --ph-accent-highlight-secondary: hsl(19 82% 56% / 16%);
139
139
  }
140
140
 
141
141
  /* OneNote — brand purple #7719aa on lavender paper. */
@@ -6,10 +6,25 @@
6
6
  * 2. Monospace stack — code, CSV, token chips, shortcuts. Functional only.
7
7
  *
8
8
  * Marketing type uses `clamp()` so a hero has ONE definition instead of three
9
- * breakpoint variants per app. Product UI keeps Tailwind's step scale.
9
+ * breakpoint variants per app. Product roles and Tailwind text utilities share
10
+ * the tokens below, including every suite component and consuming app.
10
11
  */
11
12
 
12
13
  :root {
14
+ --ph-font-sans-stack: var(--font-open-runde, "Open Runde"), ui-sans-serif, system-ui, sans-serif;
15
+ /* Product scale: comfortable body/control text, compact readable metadata. */
16
+ --ph-type-page: 1.5rem;
17
+ --ph-type-product-section: clamp(1.375rem, 1.25rem + 0.5vw, 1.5rem);
18
+ --ph-type-subsection: 1.25rem;
19
+ --ph-type-card: 1.125rem;
20
+ --ph-type-body: 1rem;
21
+ --ph-type-ui: 0.9375rem;
22
+ --ph-type-small: 0.9375rem;
23
+ --ph-type-meta: 0.8125rem;
24
+ --ph-type-overline: 0.75rem;
25
+ --ph-leading-body: 1.6;
26
+ --ph-leading-ui: 1.5;
27
+ --ph-leading-title: 1.2;
13
28
  /* Code / CSV / token chips — monospace with clear ASCII */
14
29
  --ph-font-monospace-stack:
15
30
  ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
@@ -30,6 +45,15 @@
30
45
  --ph-type-lead: clamp(1.0625rem, 1rem + 0.35vw, 1.25rem);
31
46
  }
32
47
 
48
+ @media (max-width: 639px) {
49
+ :root {
50
+ --ph-type-page: 1.375rem;
51
+ --ph-type-ui: 1rem;
52
+ --ph-type-small: 1rem;
53
+ --ph-type-meta: 0.875rem;
54
+ }
55
+ }
56
+
33
57
  /* ── Marketing / landing type ─────────────────────────────────────────────
34
58
  Use these on public pages so all five apps share one hero rhythm.
35
59
  In-app chrome keeps the Tailwind step scale; do not use hero classes