@xenide-io/the-old-ui-theme 0.3.0 → 0.3.2

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 (89) hide show
  1. package/dist/chunk-5HSOBJ4F.mjs +5968 -0
  2. package/dist/{index-D1RTT2Ap.d.mts → index-BgG8Homu.d.mts} +419 -2
  3. package/dist/{index-D1RTT2Ap.d.ts → index-BgG8Homu.d.ts} +419 -2
  4. package/dist/index.d.mts +198 -95
  5. package/dist/index.d.ts +198 -95
  6. package/dist/index.js +2995 -1136
  7. package/dist/index.mjs +629 -735
  8. package/dist/ui.d.mts +1 -1
  9. package/dist/ui.d.ts +1 -1
  10. package/dist/ui.js +1986 -156
  11. package/dist/ui.mjs +76 -3
  12. package/package.json +4 -14
  13. package/src/app/globals.css +976 -2
  14. package/src/components/charts/index.ts +9 -8
  15. package/src/components/charts/quill/BarChart.tsx +85 -0
  16. package/src/components/charts/quill/FunnelChart.tsx +49 -0
  17. package/src/components/charts/quill/InsightShell.tsx +27 -0
  18. package/src/components/charts/quill/MetricCard.tsx +44 -0
  19. package/src/components/charts/quill/PieChart.tsx +81 -0
  20. package/src/components/charts/quill/Sparkline.tsx +57 -0
  21. package/src/components/charts/quill/TimeSeriesLineChart.tsx +62 -0
  22. package/src/components/charts/quill/index.ts +9 -0
  23. package/src/components/icons/icons.tsx +2 -0
  24. package/src/components/icons/index.ts +3 -0
  25. package/src/components/icons/lemon-brand-icons.tsx +16 -0
  26. package/src/components/icons/lemon-category-icons.tsx +72 -0
  27. package/src/components/icons/lemon-icons.tsx +57 -0
  28. package/src/components/sections/IconShowcase.tsx +110 -7
  29. package/src/components/sections/NewComponentsShowcase.tsx +1052 -0
  30. package/src/components/sections/ProductLayoutsShowcase.tsx +57 -117
  31. package/src/components/sections/QuillChartShowcase.tsx +92 -0
  32. package/src/components/sections/QuillDashboardShowcase.tsx +149 -0
  33. package/src/components/sections/SidebarShowcase.tsx +152 -0
  34. package/src/components/sections/TableShowcase.tsx +2 -0
  35. package/src/components/sections/TooltipShowcase.tsx +19 -25
  36. package/src/components/ui/AlertDialog.tsx +62 -0
  37. package/src/components/ui/AppLayout.tsx +27 -0
  38. package/src/components/ui/Autocomplete.tsx +106 -0
  39. package/src/components/ui/Banner.tsx +63 -0
  40. package/src/components/ui/ButtonGroup.tsx +16 -0
  41. package/src/components/ui/Chip.tsx +46 -0
  42. package/src/components/ui/Collapsible.tsx +46 -0
  43. package/src/components/ui/Combobox.tsx +119 -0
  44. package/src/components/ui/ContextMenu.tsx +81 -0
  45. package/src/components/ui/DataTable.tsx +133 -0
  46. package/src/components/ui/DatePicker.tsx +96 -0
  47. package/src/components/ui/Dialog.tsx +75 -0
  48. package/src/components/ui/Divider.tsx +39 -0
  49. package/src/components/ui/Dot.tsx +32 -0
  50. package/src/components/ui/InputGroup.tsx +16 -0
  51. package/src/components/ui/Lettermark.tsx +47 -0
  52. package/src/components/ui/Link.tsx +32 -0
  53. package/src/components/ui/LoadingBar.tsx +25 -0
  54. package/src/components/ui/Menubar.tsx +66 -0
  55. package/src/components/ui/Metric.tsx +34 -0
  56. package/src/components/ui/NumberField.tsx +76 -0
  57. package/src/components/ui/Popover.tsx +73 -0
  58. package/src/components/ui/ProgressCircle.tsx +63 -0
  59. package/src/components/ui/Resizable.tsx +71 -0
  60. package/src/components/ui/Row.tsx +51 -0
  61. package/src/components/ui/ScrollArea.tsx +54 -0
  62. package/src/components/ui/Sidebar.tsx +77 -0
  63. package/src/components/ui/Snack.tsx +48 -0
  64. package/src/components/ui/Spinner.tsx +30 -0
  65. package/src/components/ui/Splotch.tsx +33 -0
  66. package/src/components/ui/Table.tsx +2 -0
  67. package/src/components/ui/Tag.tsx +65 -0
  68. package/src/components/ui/Toggle.tsx +62 -0
  69. package/src/components/ui/Tooltip.test.tsx +58 -0
  70. package/src/components/ui/Tooltip.tsx +211 -0
  71. package/src/components/ui/Widget.tsx +31 -0
  72. package/src/components/ui/index.ts +275 -21
  73. package/dist/chunk-FDMD3IIN.mjs +0 -3831
  74. package/src/components/charts/ph-insight-charts.tsx +0 -162
  75. package/src/components/dashboard/DashboardFiltersBar.tsx +0 -19
  76. package/src/components/dashboard/DashboardGrid.tsx +0 -23
  77. package/src/components/dashboard/DashboardInsightPlaceholder.tsx +0 -37
  78. package/src/components/dashboard/DashboardKpiCard.tsx +0 -25
  79. package/src/components/dashboard/DashboardToolbar.tsx +0 -23
  80. package/src/components/dashboard/DashboardWell.tsx +0 -10
  81. package/src/components/dashboard/InsightMiniCard.tsx +0 -26
  82. package/src/components/dashboard/InsightShell.tsx +0 -37
  83. package/src/components/dashboard/InsightShellHeader.tsx +0 -22
  84. package/src/components/dashboard/MiniTrendBars.tsx +0 -51
  85. package/src/components/dashboard/index.ts +0 -31
  86. package/src/components/dashboard/types.ts +0 -9
  87. package/src/components/sections/ChartShowcase.tsx +0 -190
  88. package/src/components/sections/DashboardShowcase.tsx +0 -191
  89. package/src/components/sections/StatShowcase.tsx +0 -129
@@ -184,7 +184,7 @@ body {
184
184
  ) {
185
185
  --ph-btn-depth: 0px;
186
186
  --ph-btn-chrome-depth: var(--ph-chrome-depth);
187
- --ph-btn-border-width: 1.5px;
187
+ --ph-btn-border-width: 1px;
188
188
  --ph-btn-face: var(--ph-secondary-button-bg);
189
189
  --ph-btn-border: var(--ph-secondary-button-border);
190
190
  --ph-btn-border-hover: var(--ph-secondary-button-border-hover);
@@ -514,6 +514,71 @@ body {
514
514
  animation: ph-spin 0.65s linear infinite;
515
515
  }
516
516
 
517
+ /* A real face over a real frame stays connected at every interaction state. */
518
+ .ph-btn.ph-btn-raised {
519
+ --ph-btn-face-offset: -2px;
520
+ position: relative;
521
+ min-height: var(--ph-btn-control-size);
522
+ border: var(--ph-btn-border-width) solid var(--ph-btn-border);
523
+ border-radius: var(--ph-radius-control);
524
+ background: var(--ph-btn-frame);
525
+ transition:
526
+ border-color var(--ph-motion-fast) ease,
527
+ color var(--ph-motion-fast) ease,
528
+ opacity var(--ph-motion-fast) ease;
529
+ }
530
+
531
+ .ph-btn.ph-btn-raised .ph-btn-chrome {
532
+ z-index: 1;
533
+ box-sizing: border-box;
534
+ flex: 1;
535
+ width: auto;
536
+ min-height: calc(var(--ph-btn-control-size) - 2 * var(--ph-btn-border-width));
537
+ margin-inline: calc(-1 * var(--ph-btn-border-width));
538
+ background: var(--ph-btn-face);
539
+ border: var(--ph-btn-border-width) solid var(--ph-btn-border);
540
+ border-radius: var(--ph-radius-control);
541
+ transform: translateY(var(--ph-btn-face-offset));
542
+ transition:
543
+ border-color var(--ph-motion-fast) ease,
544
+ color var(--ph-motion-fast) ease,
545
+ transform 50ms ease-out;
546
+ }
547
+
548
+ .ph-btn.ph-btn-raised .ph-btn-chrome::before,
549
+ .ph-btn.ph-btn-raised .ph-btn-chrome::after {
550
+ content: none;
551
+ }
552
+
553
+ .ph-btn.ph-btn-raised:hover:not(:disabled) {
554
+ --ph-btn-face-offset: -3px;
555
+ border-color: var(--ph-btn-border-hover);
556
+ }
557
+
558
+ .ph-btn.ph-btn-raised:hover:not(:disabled) .ph-btn-chrome {
559
+ color: var(--ph-btn-ink);
560
+ border-color: var(--ph-btn-border-hover);
561
+ transform: translateY(var(--ph-btn-face-offset));
562
+ }
563
+
564
+ .ph-btn.ph-btn-raised:active:not(:disabled) {
565
+ --ph-btn-face-offset: -1px;
566
+ }
567
+
568
+ .ph-btn.ph-btn-raised:active:not(:disabled) .ph-btn-chrome {
569
+ transform: translateY(var(--ph-btn-face-offset));
570
+ transition-duration: 0ms;
571
+ }
572
+
573
+ .ph-btn.ph-btn-circle.ph-btn-raised,
574
+ .ph-btn-circle.ph-btn-raised .ph-btn-chrome {
575
+ border-radius: 9999px;
576
+ }
577
+
578
+ .ph-btn-outline.ph-btn-raised .ph-btn-chrome {
579
+ background: var(--ph-surface-raised);
580
+ }
581
+
517
582
  /* Surfaces — crisp edge + faint top lip beside elevation */
518
583
  .ph-panel {
519
584
  @apply border bg-ph-muted p-6;
@@ -1811,7 +1876,52 @@ body {
1811
1876
  @apply h-full rounded-full transition-all duration-300;
1812
1877
  }
1813
1878
 
1814
- /* Tooltip (simple title attr used in demos; visual wrapper) */
1879
+ /* Accessible, collision-aware tooltip overlay. */
1880
+ .ph-tooltip-content {
1881
+ @apply z-50 max-w-xs select-none px-2.5 py-1.5 text-xs font-medium;
1882
+ max-width: min(20rem, calc(100vw - 1rem));
1883
+ overflow-wrap: anywhere;
1884
+ color: var(--ph-surface-raised);
1885
+ background: var(--ph-text-primary);
1886
+ border: 1px solid color-mix(in oklab, var(--ph-text-primary) 82%, var(--ph-surface-raised));
1887
+ border-radius: var(--ph-radius-control);
1888
+ box-shadow: var(--ph-shadow-floating);
1889
+ transform-origin: var(--radix-tooltip-content-transform-origin);
1890
+ animation: ph-tooltip-in var(--ph-motion-fast) cubic-bezier(0.22, 1, 0.36, 1);
1891
+ }
1892
+
1893
+ .ph-tooltip-content[data-side="top"] {
1894
+ --ph-tooltip-entry-y: 0.1875rem;
1895
+ }
1896
+
1897
+ .ph-tooltip-content[data-side="bottom"] {
1898
+ --ph-tooltip-entry-y: -0.1875rem;
1899
+ }
1900
+
1901
+ .ph-tooltip-content[data-side="left"] {
1902
+ --ph-tooltip-entry-x: 0.1875rem;
1903
+ }
1904
+
1905
+ .ph-tooltip-content[data-side="right"] {
1906
+ --ph-tooltip-entry-x: -0.1875rem;
1907
+ }
1908
+
1909
+ .ph-tooltip-arrow {
1910
+ fill: var(--ph-text-primary);
1911
+ }
1912
+
1913
+ @keyframes ph-tooltip-in {
1914
+ from {
1915
+ opacity: 0;
1916
+ transform: translate(
1917
+ var(--ph-tooltip-entry-x, 0),
1918
+ var(--ph-tooltip-entry-y, 0)
1919
+ )
1920
+ scale(0.98);
1921
+ }
1922
+ }
1923
+
1924
+ /* Dashed trigger treatment used in tooltip examples. */
1815
1925
  .ph-tip {
1816
1926
  @apply inline-flex rounded-md border border-dashed border-ph-border px-2 py-1 text-xs text-ph-mutedtext;
1817
1927
  }
@@ -1989,4 +2099,868 @@ body {
1989
2099
  @apply rounded-lg border border-ph-border bg-neutral-950 p-4 text-xs text-neutral-100;
1990
2100
  font-family: var(--ph-font-monospace-stack);
1991
2101
  }
2102
+
2103
+ /* Banner — status strip with icon + action slot */
2104
+ .ph-banner {
2105
+ @apply flex items-start gap-3 px-4 py-3 text-sm rounded-[var(--ph-radius-surface)];
2106
+ border: 1px solid var(--ph-banner-border);
2107
+ background: var(--ph-banner-bg);
2108
+ color: var(--ph-text-primary);
2109
+ }
2110
+
2111
+ .ph-banner--square {
2112
+ border-radius: 0;
2113
+ }
2114
+
2115
+ .ph-banner__body {
2116
+ @apply flex flex-1 items-center gap-3 flex-wrap;
2117
+ }
2118
+
2119
+ .ph-banner__content {
2120
+ @apply flex-1;
2121
+ }
2122
+
2123
+ .ph-banner__action {
2124
+ @apply shrink-0;
2125
+ }
2126
+
2127
+ .ph-banner__close {
2128
+ @apply shrink-0 p-1 text-ph-subtle hover:text-ph-ink rounded-[var(--ph-radius-control)];
2129
+ touch-action: manipulation;
2130
+ }
2131
+
2132
+ .ph-banner__close:hover {
2133
+ background: color-mix(in oklab, var(--ph-text-primary) 7%, transparent);
2134
+ }
2135
+
2136
+ .ph-banner-info {
2137
+ --ph-banner-bg: var(--ph-info-bg);
2138
+ --ph-banner-border: var(--ph-info-border);
2139
+ }
2140
+
2141
+ .ph-banner-success {
2142
+ --ph-banner-bg: var(--ph-success-bg);
2143
+ --ph-banner-border: var(--ph-success-border);
2144
+ }
2145
+
2146
+ .ph-banner-warning {
2147
+ --ph-banner-bg: var(--ph-warning-bg);
2148
+ --ph-banner-border: var(--ph-warning-border);
2149
+ }
2150
+
2151
+ .ph-banner-danger {
2152
+ --ph-banner-bg: var(--ph-danger-bg);
2153
+ --ph-banner-border: var(--ph-danger-border);
2154
+ }
2155
+
2156
+ .ph-banner-ai {
2157
+ --ph-banner-bg: color-mix(in oklab, var(--ph-violet) 10%, var(--ph-surface));
2158
+ --ph-banner-border: color-mix(in oklab, var(--ph-violet) 38%, var(--ph-border));
2159
+ }
2160
+
2161
+ /* Divider */
2162
+ .ph-divider {
2163
+ @apply h-px w-full border-0 bg-ph-border;
2164
+ }
2165
+
2166
+ .ph-divider--vertical {
2167
+ @apply h-auto w-px;
2168
+ }
2169
+
2170
+ .ph-divider--thick {
2171
+ @apply h-0.5;
2172
+ }
2173
+
2174
+ .ph-divider--vertical.ph-divider--thick {
2175
+ @apply w-0.5;
2176
+ }
2177
+
2178
+ .ph-divider--dashed {
2179
+ background: none;
2180
+ border-top: 1px dashed var(--ph-border-strong);
2181
+ }
2182
+
2183
+ .ph-divider--vertical.ph-divider--dashed {
2184
+ border-top: none;
2185
+ border-left: 1px dashed var(--ph-border-strong);
2186
+ }
2187
+
2188
+ .ph-divider--with-label {
2189
+ @apply flex items-center border-0 bg-transparent;
2190
+ }
2191
+
2192
+ .ph-divider__label {
2193
+ @apply px-3 text-xs font-semibold whitespace-nowrap text-ph-mutedtext;
2194
+ }
2195
+
2196
+ .ph-divider--with-label::before,
2197
+ .ph-divider--with-label::after {
2198
+ content: "";
2199
+ @apply h-px flex-1 bg-ph-border;
2200
+ }
2201
+
2202
+ /* Tag */
2203
+ .ph-tag {
2204
+ @apply inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium;
2205
+ }
2206
+
2207
+ .ph-tag-sm {
2208
+ @apply px-2 py-0 text-[10px];
2209
+ }
2210
+
2211
+ .ph-tag__icon {
2212
+ @apply inline-flex shrink-0;
2213
+ }
2214
+
2215
+ .ph-tag__close {
2216
+ @apply inline-flex shrink-0 p-0.5 rounded-full hover:bg-black/10;
2217
+ }
2218
+
2219
+ .ph-tag-default {
2220
+ background: var(--ph-surface-inset);
2221
+ color: var(--ph-text-secondary);
2222
+ box-shadow: inset 0 0 0 1px var(--ph-border-subtle);
2223
+ }
2224
+
2225
+ .ph-tag-primary {
2226
+ background: var(--ph-selected-bg);
2227
+ color: var(--ph-selected-text);
2228
+ box-shadow: inset 0 0 0 1px var(--ph-selected-border);
2229
+ }
2230
+
2231
+ .ph-tag-success {
2232
+ background: var(--ph-success-bg);
2233
+ color: var(--ph-success-text);
2234
+ box-shadow: inset 0 0 0 1px var(--ph-success-border);
2235
+ }
2236
+
2237
+ .ph-tag-warning {
2238
+ background: var(--ph-warning-bg);
2239
+ color: var(--ph-warning-text);
2240
+ box-shadow: inset 0 0 0 1px var(--ph-warning-border);
2241
+ }
2242
+
2243
+ .ph-tag-danger {
2244
+ background: var(--ph-danger-bg);
2245
+ color: var(--ph-danger-text);
2246
+ box-shadow: inset 0 0 0 1px var(--ph-danger-border);
2247
+ }
2248
+
2249
+ .ph-tag-info {
2250
+ background: var(--ph-info-bg);
2251
+ color: var(--ph-info-text);
2252
+ box-shadow: inset 0 0 0 1px var(--ph-info-border);
2253
+ }
2254
+
2255
+ .ph-tag-muted {
2256
+ @apply bg-ph-muted text-ph-mutedtext;
2257
+ box-shadow: inset 0 0 0 1px var(--ph-border-subtle);
2258
+ }
2259
+
2260
+ .ph-tag-highlight {
2261
+ background: color-mix(in oklab, var(--ph-accent) 12%, var(--ph-surface));
2262
+ color: var(--ph-accent);
2263
+ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ph-accent) 32%, transparent);
2264
+ }
2265
+
2266
+ /* Progress circle */
2267
+ .ph-progress-circle {
2268
+ @apply relative inline-flex items-center justify-center;
2269
+ }
2270
+
2271
+ .ph-progress-circle__bar {
2272
+ transition: stroke-dashoffset 0.3s ease;
2273
+ }
2274
+
2275
+ .ph-progress-circle__content {
2276
+ @apply absolute inset-0 flex items-center justify-center text-xs font-medium;
2277
+ }
2278
+
2279
+ /* Row */
2280
+ .ph-row {
2281
+ @apply inline-flex items-center gap-2;
2282
+ }
2283
+
2284
+ .ph-row--full-width {
2285
+ @apply w-full;
2286
+ }
2287
+
2288
+ .ph-row--center {
2289
+ @apply justify-center;
2290
+ }
2291
+
2292
+ .ph-row--sm {
2293
+ @apply gap-1.5 text-sm;
2294
+ }
2295
+
2296
+ .ph-row--lg {
2297
+ @apply gap-3 text-base;
2298
+ }
2299
+
2300
+ .ph-row--success { color: var(--ph-success-text); }
2301
+ .ph-row--warning { color: var(--ph-warning-text); }
2302
+ .ph-row--danger { color: var(--ph-danger-text); }
2303
+ .ph-row--muted { @apply text-ph-mutedtext; }
2304
+
2305
+ .ph-row__main {
2306
+ @apply flex min-w-0 flex-1 items-center gap-2;
2307
+ }
2308
+
2309
+ .ph-row__icon,
2310
+ .ph-row__side-icon {
2311
+ @apply inline-flex shrink-0 items-center justify-center opacity-75;
2312
+ }
2313
+
2314
+ .ph-row__content {
2315
+ @apply min-w-0 flex-1;
2316
+ }
2317
+
2318
+ .ph-row--symbolic.ph-row__content {
2319
+ display: none;
2320
+ }
2321
+
2322
+ /* Widget */
2323
+ .ph-widget {
2324
+ @apply flex flex-col overflow-hidden;
2325
+ border-radius: var(--ph-radius-surface);
2326
+ border: 1px solid var(--ph-border-control);
2327
+ background: var(--ph-surface-raised);
2328
+ box-shadow: var(--ph-shadow-elevation-3000);
2329
+ }
2330
+
2331
+ .ph-widget__header {
2332
+ @apply flex items-center gap-2 px-4 py-2.5 text-sm font-medium;
2333
+ border-bottom: 1px solid var(--ph-border-subtle);
2334
+ background: var(--ph-surface-inset);
2335
+ }
2336
+
2337
+ .ph-widget__title {
2338
+ @apply flex-1 truncate text-ph-subtle;
2339
+ }
2340
+
2341
+ .ph-widget__close {
2342
+ @apply shrink-0 p-1 text-ph-mutedtext hover:text-ph-ink rounded;
2343
+ }
2344
+
2345
+ .ph-widget__content {
2346
+ @apply p-4;
2347
+ }
2348
+
2349
+ /* Lettermark */
2350
+ .ph-lettermark {
2351
+ @apply inline-flex items-center justify-center font-bold select-none;
2352
+ border-radius: var(--ph-radius-control);
2353
+ aspect-ratio: 1;
2354
+ background: var(--ph-muted);
2355
+ color: var(--ph-text-secondary);
2356
+ }
2357
+
2358
+ .ph-lettermark--xs { @apply h-5 w-5 text-[10px]; }
2359
+ .ph-lettermark--sm { @apply h-7 w-7 text-xs; }
2360
+ .ph-lettermark--md { @apply h-10 w-10 text-sm; }
2361
+ .ph-lettermark--lg { @apply h-14 w-14 text-lg; }
2362
+
2363
+ .ph-lettermark--rounded {
2364
+ border-radius: 9999px;
2365
+ }
2366
+
2367
+ .ph-lettermark--outlined {
2368
+ background: transparent;
2369
+ box-shadow: inset 0 0 0 1px var(--ph-border-strong);
2370
+ }
2371
+
2372
+ .ph-lettermark--unknown {
2373
+ @apply text-ph-mutedtext;
2374
+ }
2375
+
2376
+ .ph-lettermark--v-1 { background: #eb9d2a; color: #fff; }
2377
+ .ph-lettermark--v-2 { background: #1d4aff; color: #fff; }
2378
+ .ph-lettermark--v-3 { background: #621da6; color: #fff; }
2379
+ .ph-lettermark--v-4 { background: #42827e; color: #fff; }
2380
+ .ph-lettermark--v-5 { background: #ce0e74; color: #fff; }
2381
+ .ph-lettermark--v-6 { background: #529a0a; color: #fff; }
2382
+ .ph-lettermark--v-7 { background: #fe729e; color: #fff; }
2383
+ .ph-lettermark--v-8 { background: #f14f58; color: #fff; }
2384
+
2385
+ .ph-lettermark--outlined.ph-lettermark--v-1 { background: transparent; color: #eb9d2a; box-shadow: inset 0 0 0 1px #eb9d2a; }
2386
+ .ph-lettermark--outlined.ph-lettermark--v-2 { background: transparent; color: #1d4aff; box-shadow: inset 0 0 0 1px #1d4aff; }
2387
+ .ph-lettermark--outlined.ph-lettermark--v-3 { background: transparent; color: #621da6; box-shadow: inset 0 0 0 1px #621da6; }
2388
+ .ph-lettermark--outlined.ph-lettermark--v-4 { background: transparent; color: #42827e; box-shadow: inset 0 0 0 1px #42827e; }
2389
+ .ph-lettermark--outlined.ph-lettermark--v-5 { background: transparent; color: #ce0e74; box-shadow: inset 0 0 0 1px #ce0e74; }
2390
+ .ph-lettermark--outlined.ph-lettermark--v-6 { background: transparent; color: #529a0a; box-shadow: inset 0 0 0 1px #529a0a; }
2391
+ .ph-lettermark--outlined.ph-lettermark--v-7 { background: transparent; color: #fe729e; box-shadow: inset 0 0 0 1px #fe729e; }
2392
+ .ph-lettermark--outlined.ph-lettermark--v-8 { background: transparent; color: #f14f58; box-shadow: inset 0 0 0 1px #f14f58; }
2393
+
2394
+ /* Splotch */
2395
+ .ph-splotch {
2396
+ @apply inline-flex items-center justify-center;
2397
+ width: 1.5rem;
2398
+ height: 1.5rem;
2399
+ border-radius: 9999px;
2400
+ }
2401
+
2402
+ .ph-splotch__paint {
2403
+ width: 1rem;
2404
+ height: 1rem;
2405
+ border-radius: 9999px;
2406
+ }
2407
+
2408
+ .ph-splotch--purple .ph-splotch__paint { background: #8e7aee; }
2409
+ .ph-splotch--blue .ph-splotch__paint { background: #1d4aff; }
2410
+ .ph-splotch--green .ph-splotch__paint { background: #529a0a; }
2411
+ .ph-splotch--black .ph-splotch__paint { background: #1a1a1a; }
2412
+ .ph-splotch--white .ph-splotch__paint { background: #fff; box-shadow: inset 0 0 0 1px var(--ph-border-strong); }
2413
+ .ph-splotch--orange .ph-splotch__paint { background: #eb9d2a; }
2414
+ .ph-splotch--red .ph-splotch__paint { background: #f14f58; }
2415
+ .ph-splotch--yellow .ph-splotch__paint { background: #f4c430; }
2416
+
2417
+ /* Popover */
2418
+ .ph-popover {
2419
+ @apply inline-flex;
2420
+ }
2421
+
2422
+ .ph-popover__trigger {
2423
+ @apply cursor-pointer;
2424
+ }
2425
+
2426
+ .ph-popover__panel {
2427
+ @apply absolute z-50 min-w-[10rem] overflow-y-auto bg-ph-surface p-1;
2428
+ max-width: min(22rem, calc(100vw - 1rem));
2429
+ border-radius: var(--ph-radius-overlay);
2430
+ border: 1px solid var(--ph-border-control);
2431
+ box-shadow: var(--ph-shadow-floating);
2432
+ animation: ph-popover-in 80ms cubic-bezier(0.22, 1, 0.36, 1);
2433
+ }
2434
+
2435
+ .ph-popover__panel--padded {
2436
+ @apply p-3;
2437
+ }
2438
+
2439
+ .ph-popover__panel--match {
2440
+ @apply w-full;
2441
+ }
2442
+
2443
+ .ph-popover--bottom {
2444
+ @apply left-0 top-full mt-1;
2445
+ }
2446
+
2447
+ .ph-popover--top {
2448
+ @apply left-0 bottom-full mb-1;
2449
+ }
2450
+
2451
+ .ph-popover--left {
2452
+ @apply right-full top-0 mr-1;
2453
+ }
2454
+
2455
+ .ph-popover--right {
2456
+ @apply left-full top-0 ml-1;
2457
+ }
2458
+
2459
+ @keyframes ph-popover-in {
2460
+ from {
2461
+ opacity: 0;
2462
+ transform: scale(0.97);
2463
+ }
2464
+ }
2465
+
2466
+ /* Loading bar */
2467
+ .ph-loading-bar {
2468
+ @apply h-1 w-full overflow-hidden bg-ph-muted;
2469
+ border-radius: var(--ph-radius-control);
2470
+ }
2471
+
2472
+ .ph-loading-bar__fill {
2473
+ @apply h-full w-0 rounded-full bg-ph-brand transition-[width] duration-300;
2474
+ }
2475
+
2476
+ .ph-loading-bar--active .ph-loading-bar__fill {
2477
+ @apply w-1/2;
2478
+ animation: ph-loading-bar-indeterminate 1.5s ease-in-out infinite;
2479
+ }
2480
+
2481
+ @keyframes ph-loading-bar-indeterminate {
2482
+ 0% { transform: translateX(-100%); }
2483
+ 50% { transform: translateX(100%); }
2484
+ 100% { transform: translateX(200%); }
2485
+ }
2486
+
2487
+ /* Link */
2488
+ .ph-link {
2489
+ @apply inline cursor-pointer font-medium text-ph-brand no-underline transition;
2490
+ }
2491
+
2492
+ .ph-link:hover {
2493
+ color: var(--ph-accent-hover);
2494
+ text-decoration: underline;
2495
+ }
2496
+
2497
+ .ph-link:focus-visible {
2498
+ outline: 3px solid color-mix(in oklab, var(--ph-focus-ring) 32%, transparent);
2499
+ outline-offset: 2px;
2500
+ border-radius: var(--ph-radius-control);
2501
+ }
2502
+
2503
+ /* Spinner */
2504
+ .ph-spinner {
2505
+ @apply inline-flex items-center justify-center;
2506
+ }
2507
+
2508
+ .ph-spinner__svg {
2509
+ @apply animate-spin;
2510
+ }
2511
+
2512
+ .ph-spinner--sm .ph-spinner__svg {
2513
+ @apply h-4 w-4;
2514
+ }
2515
+
2516
+ .ph-spinner--md .ph-spinner__svg {
2517
+ @apply h-6 w-6;
2518
+ }
2519
+
2520
+ .ph-spinner--lg .ph-spinner__svg {
2521
+ @apply h-8 w-8;
2522
+ }
2523
+
2524
+ .ph-spinner--text-colored {
2525
+ color: currentColor;
2526
+ }
2527
+
2528
+ .ph-spinner:not(.ph-spinner--text-colored) {
2529
+ color: var(--ph-accent);
2530
+ }
2531
+
2532
+ /* Snack */
2533
+ .ph-snack {
2534
+ @apply inline-flex max-w-full items-center gap-1 overflow-hidden text-ellipsis whitespace-nowrap py-1 leading-5;
2535
+ background: var(--ph-accent-highlight-secondary);
2536
+ color: var(--ph-text-secondary);
2537
+ padding-left: 0.375rem;
2538
+ padding-right: 0.375rem;
2539
+ border-radius: 0.25rem;
2540
+ }
2541
+
2542
+ .ph-snack--pill {
2543
+ @apply h-8 rounded-full;
2544
+ padding-left: 1rem;
2545
+ padding-right: 1rem;
2546
+ background: color-mix(in oklab, var(--ph-toolbar) 80%, var(--ph-surface));
2547
+ box-shadow: inset 0 0 0 1px var(--ph-border-subtle);
2548
+ }
2549
+
2550
+ .ph-snack__text {
2551
+ @apply overflow-hidden text-ellipsis text-xs;
2552
+ }
2553
+
2554
+ .ph-snack__close {
2555
+ @apply inline-flex shrink-0 items-center justify-center p-0.5 rounded hover:bg-black/10;
2556
+ }
2557
+
2558
+ /* Combobox */
2559
+ .ph-combobox {
2560
+ @apply relative;
2561
+ }
2562
+
2563
+ .ph-combobox__input-wrap {
2564
+ @apply flex min-h-[2.3125rem] flex-wrap items-center gap-1 rounded-[var(--ph-radius-control)] border bg-ph-surface px-2 py-1;
2565
+ border-color: var(--ph-border-control);
2566
+ box-shadow: var(--ph-chrome-inset-face-top), var(--ph-chrome-inset-face-bottom);
2567
+ }
2568
+
2569
+ .ph-combobox__input-wrap:focus-within {
2570
+ outline: none;
2571
+ border-color: color-mix(in oklab, var(--ph-focus-ring) 58%, var(--ph-border));
2572
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--ph-focus-ring) 24%, transparent), var(--ph-chrome-inset-face-top), var(--ph-chrome-inset-face-bottom);
2573
+ }
2574
+
2575
+ .ph-combobox__input {
2576
+ @apply min-w-[4rem] flex-1 border-0 bg-transparent px-1 py-0.5 text-sm text-ph-ink outline-none;
2577
+ }
2578
+
2579
+ .ph-combobox__chips {
2580
+ @apply flex flex-wrap items-center gap-1;
2581
+ }
2582
+
2583
+ .ph-combobox__chip {
2584
+ @apply inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium;
2585
+ background: var(--ph-selected-bg);
2586
+ color: var(--ph-selected-text);
2587
+ }
2588
+
2589
+ .ph-combobox__chip-remove {
2590
+ @apply inline-flex p-0.5 rounded-full hover:bg-black/10;
2591
+ }
2592
+
2593
+ .ph-combobox__dropdown {
2594
+ @apply absolute left-0 right-0 top-full z-50 mt-1 max-h-60 overflow-y-auto rounded-lg border bg-ph-surface p-1 shadow-lg;
2595
+ border-color: var(--ph-border-control);
2596
+ }
2597
+
2598
+ .ph-combobox__option {
2599
+ @apply flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-ph-subtle hover:bg-ph-muted hover:text-ph-ink;
2600
+ }
2601
+
2602
+ .ph-combobox__option--selected {
2603
+ color: var(--ph-selected-text);
2604
+ background: var(--ph-selected-bg);
2605
+ }
2606
+
2607
+ /* Autocomplete */
2608
+ .ph-autocomplete__dropdown {
2609
+ @apply absolute left-0 right-0 top-full z-50 mt-1 max-h-60 overflow-y-auto rounded-lg border bg-ph-surface p-1 shadow-lg;
2610
+ border-color: var(--ph-border-control);
2611
+ }
2612
+
2613
+ .ph-autocomplete__option {
2614
+ @apply flex w-full items-center rounded-md px-3 py-2 text-left text-sm text-ph-subtle hover:bg-ph-muted hover:text-ph-ink;
2615
+ }
2616
+
2617
+ .ph-autocomplete__option--active {
2618
+ background: var(--ph-surface-hover);
2619
+ color: var(--ph-text-primary);
2620
+ }
2621
+
2622
+ /* Context menu */
2623
+ .ph-context-menu__panel {
2624
+ @apply fixed z-[100] min-w-[10rem] rounded-lg border bg-ph-surface p-1 shadow-lg;
2625
+ border-color: var(--ph-border-control);
2626
+ }
2627
+
2628
+ .ph-context-menu__item {
2629
+ @apply flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-ph-subtle hover:bg-ph-muted hover:text-ph-ink disabled:opacity-50;
2630
+ }
2631
+
2632
+ .ph-context-menu__icon {
2633
+ @apply inline-flex h-4 w-4 items-center justify-center;
2634
+ }
2635
+
2636
+ .ph-context-menu__separator {
2637
+ @apply my-1 h-px bg-ph-border;
2638
+ }
2639
+
2640
+ /* Resizable */
2641
+ .ph-resizable__handle {
2642
+ position: relative;
2643
+ width: 0.375rem;
2644
+ background: transparent;
2645
+ transition: background-color 150ms ease;
2646
+ flex-shrink: 0;
2647
+ cursor: col-resize;
2648
+ }
2649
+
2650
+ .ph-resizable__handle:hover,
2651
+ .ph-resizable__handle:active {
2652
+ background: color-mix(in oklab, var(--ph-accent) 20%, transparent);
2653
+ }
2654
+
2655
+ .ph-resizable__handle::after {
2656
+ content: "";
2657
+ position: absolute;
2658
+ left: 50%;
2659
+ top: 50%;
2660
+ height: 2rem;
2661
+ width: 0.125rem;
2662
+ transform: translate(-50%, -50%);
2663
+ border-radius: 9999px;
2664
+ background: var(--ph-border);
2665
+ pointer-events: none;
2666
+ }
2667
+
2668
+ /* Scroll area */
2669
+ .ph-scroll-area {
2670
+ @apply relative;
2671
+ }
2672
+
2673
+ .ph-scroll-area__viewport {
2674
+ @apply h-full;
2675
+ scrollbar-width: thin;
2676
+ scrollbar-color: var(--ph-border) transparent;
2677
+ }
2678
+
2679
+ .ph-scroll-area__shadow-top,
2680
+ .ph-scroll-area__shadow-bottom {
2681
+ @apply pointer-events-none absolute left-0 right-0 z-10 h-4;
2682
+ }
2683
+
2684
+ .ph-scroll-area__shadow-top {
2685
+ @apply top-0;
2686
+ background: linear-gradient(to bottom, var(--ph-surface), transparent);
2687
+ }
2688
+
2689
+ .ph-scroll-area__shadow-bottom {
2690
+ @apply bottom-0;
2691
+ background: linear-gradient(to top, var(--ph-surface), transparent);
2692
+ }
2693
+
2694
+ /* Number field */
2695
+ .ph-number-field__control {
2696
+ @apply inline-flex items-stretch overflow-hidden;
2697
+ border-radius: var(--ph-radius-control);
2698
+ border: 1px solid var(--ph-border-control);
2699
+ background: var(--ph-surface-raised);
2700
+ box-shadow: var(--ph-chrome-inset-face-top), var(--ph-chrome-inset-face-bottom);
2701
+ }
2702
+
2703
+ .ph-number-field__input {
2704
+ @apply w-16 border-0 bg-transparent px-2 py-1.5 text-center text-sm text-ph-ink outline-none;
2705
+ -moz-appearance: textfield;
2706
+ }
2707
+
2708
+ .ph-number-field__input::-webkit-inner-spin-button,
2709
+ .ph-number-field__input::-webkit-outer-spin-button {
2710
+ -webkit-appearance: none;
2711
+ }
2712
+
2713
+ .ph-number-field__btn {
2714
+ @apply inline-flex items-center justify-center px-2 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink disabled:opacity-40;
2715
+ }
2716
+
2717
+ /* Input group */
2718
+ .ph-input-group {
2719
+ @apply flex items-stretch overflow-hidden;
2720
+ border-radius: var(--ph-radius-control);
2721
+ }
2722
+
2723
+ .ph-input-group > :first-child {
2724
+ border-top-right-radius: 0;
2725
+ border-bottom-right-radius: 0;
2726
+ }
2727
+
2728
+ .ph-input-group > :last-child {
2729
+ border-top-left-radius: 0;
2730
+ border-bottom-left-radius: 0;
2731
+ }
2732
+
2733
+ .ph-input-group > :not(:first-child):not(:last-child) {
2734
+ border-radius: 0;
2735
+ }
2736
+
2737
+ /* Button group */
2738
+ .ph-btn-group {
2739
+ @apply inline-flex items-stretch overflow-hidden;
2740
+ border-radius: var(--ph-radius-control);
2741
+ border: 1px solid var(--ph-border-control);
2742
+ }
2743
+
2744
+ .ph-btn-group > * {
2745
+ @apply rounded-none border-0;
2746
+ box-shadow: inset 1px 0 0 var(--ph-border-subtle);
2747
+ }
2748
+
2749
+ .ph-btn-group > :first-child {
2750
+ box-shadow: none;
2751
+ }
2752
+
2753
+ /* Toggle button */
2754
+ .ph-toggle-btn {
2755
+ @apply inline-flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm font-medium text-ph-subtle transition;
2756
+ border-color: var(--ph-border-control);
2757
+ background: var(--ph-surface-raised);
2758
+ }
2759
+
2760
+ .ph-toggle-btn:hover {
2761
+ background: var(--ph-surface-hover);
2762
+ color: var(--ph-text-primary);
2763
+ }
2764
+
2765
+ .ph-toggle-btn--pressed {
2766
+ background: var(--ph-selected-bg);
2767
+ color: var(--ph-selected-text);
2768
+ border-color: var(--ph-selected-border);
2769
+ }
2770
+
2771
+ .ph-toggle-btn__icon {
2772
+ @apply inline-flex;
2773
+ }
2774
+
2775
+ .ph-toggle-group {
2776
+ @apply inline-flex gap-1;
2777
+ }
2778
+
2779
+ /* Menubar */
2780
+ .ph-menubar {
2781
+ @apply inline-flex items-center gap-1 rounded-lg border bg-ph-surface px-1 py-1;
2782
+ border-color: var(--ph-border-control);
2783
+ }
2784
+
2785
+ .ph-menubar__item {
2786
+ @apply relative;
2787
+ }
2788
+
2789
+ .ph-menubar__trigger {
2790
+ @apply rounded-md px-3 py-1.5 text-sm font-medium text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink;
2791
+ }
2792
+
2793
+ .ph-menubar__trigger--open {
2794
+ background: var(--ph-surface-hover);
2795
+ color: var(--ph-text-primary);
2796
+ }
2797
+
2798
+ .ph-menubar__dropdown {
2799
+ @apply absolute left-0 top-full z-50 mt-1 min-w-[10rem] rounded-lg border bg-ph-surface p-1 shadow-lg;
2800
+ border-color: var(--ph-border-control);
2801
+ }
2802
+
2803
+ .ph-menubar__sub-item {
2804
+ @apply flex w-full items-center rounded-md px-3 py-2 text-left text-sm text-ph-subtle hover:bg-ph-muted hover:text-ph-ink disabled:opacity-50;
2805
+ }
2806
+
2807
+ .ph-menubar__separator {
2808
+ @apply my-1 h-px bg-ph-border;
2809
+ }
2810
+
2811
+ /* Dot */
2812
+ .ph-dot {
2813
+ @apply inline-block shrink-0 rounded-full;
2814
+ }
2815
+
2816
+ /* Collapsible */
2817
+ .ph-collapsible {
2818
+ @apply overflow-hidden rounded-lg border;
2819
+ border-color: var(--ph-border-control);
2820
+ }
2821
+
2822
+ .ph-collapsible__trigger {
2823
+ @apply flex w-full items-center gap-2 px-4 py-3 text-left text-sm font-medium text-ph-ink transition hover:bg-ph-muted;
2824
+ }
2825
+
2826
+ .ph-collapsible__chevron {
2827
+ @apply shrink-0 transition-transform duration-150;
2828
+ }
2829
+
2830
+ .ph-collapsible__chevron--open {
2831
+ transform: rotate(180deg);
2832
+ }
2833
+
2834
+ .ph-collapsible__content {
2835
+ @apply border-t px-4 py-3 text-sm text-ph-subtle;
2836
+ border-color: var(--ph-border-subtle);
2837
+ }
2838
+
2839
+ /* Metric */
2840
+ .ph-metric {
2841
+ @apply flex flex-col gap-1 rounded-[var(--ph-radius-surface)] border bg-ph-surface p-5;
2842
+ border-color: var(--ph-border-subtle);
2843
+ }
2844
+
2845
+ .ph-metric__header {
2846
+ @apply flex items-center gap-2;
2847
+ }
2848
+
2849
+ .ph-metric__icon {
2850
+ @apply inline-flex text-ph-mutedtext;
2851
+ }
2852
+
2853
+ .ph-metric__label {
2854
+ @apply text-xs font-medium text-ph-mutedtext;
2855
+ }
2856
+
2857
+ .ph-metric__badge {
2858
+ @apply ml-auto;
2859
+ }
2860
+
2861
+ .ph-metric__value {
2862
+ @apply text-2xl font-bold tabular-nums text-ph-ink;
2863
+ }
2864
+
2865
+ .ph-metric__trend {
2866
+ @apply text-xs text-ph-subtle;
2867
+ }
2868
+
2869
+ /* Chip */
2870
+ .ph-chip {
2871
+ @apply inline-flex items-center gap-1 rounded-full border px-3 py-1 text-xs font-medium text-ph-subtle transition;
2872
+ border-color: var(--ph-border-control);
2873
+ background: var(--ph-surface-raised);
2874
+ }
2875
+
2876
+ .ph-chip:hover {
2877
+ border-color: var(--ph-border-strong);
2878
+ color: var(--ph-text-primary);
2879
+ }
2880
+
2881
+ .ph-chip--selected {
2882
+ background: var(--ph-selected-bg);
2883
+ color: var(--ph-selected-text);
2884
+ border-color: var(--ph-selected-border);
2885
+ }
2886
+
2887
+ .ph-chip__text {
2888
+ @apply truncate;
2889
+ }
2890
+
2891
+ .ph-chip__remove {
2892
+ @apply inline-flex p-0.5 rounded-full hover:bg-black/10;
2893
+ }
2894
+
2895
+ /* Data table */
2896
+ .ph-data-table__toolbar {
2897
+ @apply mb-3;
2898
+ }
2899
+
2900
+ .ph-data-table__pagination {
2901
+ @apply mt-3 flex items-center justify-between;
2902
+ }
2903
+
2904
+ .ph-data-table__page-btn {
2905
+ @apply rounded-md px-3 py-1 text-xs font-medium text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink disabled:opacity-40;
2906
+ }
2907
+
2908
+ /* Date picker */
2909
+ .ph-datepicker__dropdown {
2910
+ @apply absolute left-0 top-full z-50 mt-1 w-[18rem] rounded-lg border bg-ph-surface p-3 shadow-lg;
2911
+ border-color: var(--ph-border-control);
2912
+ }
2913
+
2914
+ .ph-datepicker__nav {
2915
+ @apply mb-3 flex items-center justify-between;
2916
+ }
2917
+
2918
+ .ph-datepicker__nav-btn {
2919
+ @apply rounded-md p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink;
2920
+ }
2921
+
2922
+ .ph-datepicker__nav-label {
2923
+ @apply text-sm font-semibold text-ph-ink;
2924
+ }
2925
+
2926
+ .ph-datepicker__grid {
2927
+ @apply grid grid-cols-7 gap-0.5 text-center;
2928
+ }
2929
+
2930
+ /* App layout sidebar + content */
2931
+ .ph-app-layout {
2932
+ min-height: 100vh;
2933
+ }
2934
+
2935
+ .ph-sidebar {
2936
+ @apply select-none;
2937
+ }
2938
+
2939
+ .ph-sidebar__item-icon {
2940
+ @apply text-ph-mutedtext;
2941
+ }
2942
+
2943
+ .ph-sidebar__item:hover .ph-sidebar__item-icon,
2944
+ .ph-sidebar__item[data-active] .ph-sidebar__item-icon {
2945
+ @apply text-ph-ink;
2946
+ }
2947
+
2948
+ .ph-datepicker__day-header {
2949
+ @apply py-1 text-[11px] font-semibold uppercase text-ph-mutedtext;
2950
+ }
2951
+
2952
+ .ph-datepicker__day {
2953
+ @apply rounded-md p-1.5 text-sm text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink disabled:opacity-40;
2954
+ }
2955
+
2956
+ .ph-datepicker__day--other {
2957
+ @apply opacity-40;
2958
+ }
2959
+
2960
+ .ph-datepicker__day--selected {
2961
+ background: var(--ph-selected-bg);
2962
+ color: var(--ph-selected-text);
2963
+ font-weight: 600;
2964
+ }
2965
+
1992
2966
  }