@sylwellsoftware/fray 0.4.0 → 0.6.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 (50) hide show
  1. package/README.md +51 -27
  2. package/colors/README.md +28 -13
  3. package/colors/gray/colors.css +54 -26
  4. package/colors/green/colors.css +54 -26
  5. package/colors/iceblue/colors.css +54 -26
  6. package/colors/ocean/colors.css +54 -26
  7. package/colors/orange/colors.css +54 -26
  8. package/colors/purple/colors.css +54 -26
  9. package/colors/red/colors.css +54 -26
  10. package/colors/yellow/colors.css +54 -26
  11. package/dist/Components/data/descriptionList.d.ts.map +1 -1
  12. package/dist/Components/data/listview/listview.d.ts.map +1 -1
  13. package/dist/Components/data/table/DataTable.d.ts.map +1 -1
  14. package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
  15. package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
  16. package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
  17. package/dist/Components/dialog/dialog.d.ts.map +1 -1
  18. package/dist/Components/layout/panel.d.ts +0 -1
  19. package/dist/Components/layout/panel.d.ts.map +1 -1
  20. package/dist/Components/layout/sidebar.d.ts +0 -1
  21. package/dist/Components/layout/sidebar.d.ts.map +1 -1
  22. package/dist/Components/layout/tabpanel/tabline.d.ts.map +1 -1
  23. package/dist/Components/layout/tabpanel/tabpanel.d.ts.map +1 -1
  24. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/Components/lineinputs/dropdown.d.ts.map +1 -1
  26. package/dist/Components/lineinputs/textbox.d.ts.map +1 -1
  27. package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
  28. package/dist/Components/menu/toolbar.d.ts +0 -1
  29. package/dist/Components/menu/toolbar.d.ts.map +1 -1
  30. package/dist/Components/status/progressBar.d.ts.map +1 -1
  31. package/dist/Components/theme/stylesheetPicker.d.ts.map +1 -1
  32. package/dist/index.js +1226 -1421
  33. package/dist/index.js.map +1 -1
  34. package/dist/{jsx-dev-runtime-pzseD2Sz.js → jsx-dev-runtime-CqunwZ8j.js} +404 -486
  35. package/dist/jsx-dev-runtime-CqunwZ8j.js.map +1 -0
  36. package/dist/jsx-dev-runtime.js +1 -1
  37. package/dist/jsx-runtime.js +1 -1
  38. package/dist/styling/baseStyleDefinitions.d.ts +0 -82
  39. package/dist/styling/baseStyleDefinitions.d.ts.map +1 -1
  40. package/dist/styling/theme.d.ts +3 -3
  41. package/dist/styling/theme.d.ts.map +1 -1
  42. package/package.json +3 -3
  43. package/styles/structural.css +72 -413
  44. package/themes/README.md +68 -66
  45. package/themes/dark.css +48 -1
  46. package/themes/java/theme.css +410 -135
  47. package/themes/light.css +48 -1
  48. package/themes/minimal/theme.css +408 -125
  49. package/themes/shiny/theme.css +484 -294
  50. package/dist/jsx-dev-runtime-pzseD2Sz.js.map +0 -1
package/README.md CHANGED
@@ -15,6 +15,23 @@ Chromium, Firefox, and Safari at candidate time. Its reproducible test matrix
15
15
  uses Playwright's pinned Chromium, Firefox, and WebKit builds. Repository
16
16
  tooling requires Node 22+ and pnpm 10; Fray's runtime itself is browser-only.
17
17
 
18
+ ## Why Fray
19
+
20
+ Fray presents application values without requiring developers to translate
21
+ them into a second UI-specific state system. A control writes the same Glue
22
+ emitter that a derivation or query can observe, and a component renders the
23
+ downstream value it actually needs. State remains owned and explicit, while
24
+ reactive propagation and rendering mechanics stay library concerns.
25
+
26
+ Presentation should be equally direct. Native HTML already defines buttons,
27
+ inputs, tables, lists, progress, dialogs, and landmarks, so Fray uses those
28
+ elements when their semantics match. Components that need another boundary use
29
+ readable light-DOM host names rather than framework identity classes.
30
+ Application classes remain available for meaningful reusable traits and
31
+ consumer styling, while Fray's current structural implementation uses explicit
32
+ host and part metadata for its own layout and documented exceptional theme
33
+ rules.
34
+
18
35
  ## Design model
19
36
 
20
37
  Fray is the presentation half of a deliberately two-layer architecture:
@@ -204,7 +221,7 @@ not a framework identity class. The default application runtime therefore
204
221
  produces DOM such as:
205
222
 
206
223
  ```html
207
- <fray-panel data-fray-component="panel">
224
+ <fray-panel class="panellike" data-fray-component="panel">
208
225
  <fray-textbox data-fray-component="textbox">
209
226
  <input type="text">
210
227
  </fray-textbox>
@@ -216,8 +233,10 @@ Native semantics remain native: `Button` renders `button`, `Toggle` renders
216
233
  `fieldset`, `Sidebar` renders `aside`, and table header components render
217
234
  `thead`/`th`. `Tab` is a declarative child consumed by `TabPanel` and has no
218
235
  independent root. The
219
- `data-fray-component` attribute keeps diagnostics unambiguous without taking
220
- ownership of the consumer's `class`/`className`.
236
+ `data-fray-component` keeps diagnostics unambiguous. It is not a structural or
237
+ theme selector. Fray may merge public presentation traits such as `panellike`
238
+ with an application-supplied `class`/`className`; those traits describe a
239
+ reusable capability, not component identity.
221
240
 
222
241
  Element naming is an immutable application-runtime setting:
223
242
 
@@ -663,7 +682,7 @@ Fray's styling system has three physically and conceptually separate layers:
663
682
  | --- | --- | --- | --- |
664
683
  | Structure | `styles/structural.css` | Generated component layout, flow, sizing, positioning, accessibility mechanics, stable hooks, and variable consumption | Loaded once; remains stable during presentation changes |
665
684
  | Theme | `themes/<name>/theme.css` | Typography, spacing, geometry, depth, surface treatment, semantic family mappings, and exceptional pseudo/native rendering | Loaded separately and independently replaceable |
666
- | Colors | `colors/<name>/colors.css` | Palette primitives and semantic color roles | Loaded separately and independently replaceable |
685
+ | Colors | `colors/<name>/colors.css` | Primary, secondary, and neutral ramps plus contrast/color primitives; no UI-semantic roles | Loaded separately and independently replaceable |
667
686
 
668
687
  Component authors place only structure and mechanics in `static css`: display,
669
688
  flow, sizing, positioning, overflow, stable state hooks, and consumption of
@@ -691,7 +710,7 @@ CSS custom properties are Fray's primary theme integration protocol:
691
710
 
692
711
  ```text
693
712
  colors.css
694
- --fray-color-* palette/semantic roles
713
+ --palette-primary-* / --palette-secondary-* / --palette-neutral-*
695
714
 
696
715
 
697
716
  theme.css
@@ -715,39 +734,44 @@ that should look different. `frayThemeVariableCatalog` exports this contract in
715
734
  machine-readable form, including every variable's layer, family, value kind,
716
735
  purpose, and optional fallback.
717
736
 
718
- A custom component should consume the same hierarchy rather than forcing every
719
- theme to learn a new selector:
737
+ A custom component can apply the public trait matching the treatment it needs
738
+ and optionally consume the same variable hierarchy:
720
739
 
721
740
  ```css
722
- acme-grid > header {
723
- color: var(
724
- --acme-grid-header-color,
725
- var(--fray-table-header-color, var(--fray-header-color))
726
- );
727
- background: var(
728
- --acme-grid-header-background,
729
- var(--fray-table-header-background, var(--fray-header-background))
730
- );
741
+ acme-grid.datacomponentlike > header {
742
+ color: var(--table-header-color, var(--header-color));
743
+ background: var(--table-header-background, var(--header-background));
731
744
  }
732
745
  ```
733
746
 
734
- That component immediately follows compatible Fray themes while retaining a
735
- consumer/component-specific escape hatch.
736
-
737
- Variables are preferred, not mandatory. Some visual treatments require actual
738
- selectors and pseudo-elements. Shiny uses theme-scoped stable
739
- `data-fray-component`, `data-part`, role, and ARIA-state hooks to layer
740
- highlights over headers and button-like controls, draw custom dropdown arrows
741
- and checkbox surfaces, and style native progress pseudo-parts. These rules must
742
- not depend on application classes or generated IDs, must never intercept
743
- pointer events, and must yield to native representation under forced colors.
747
+ Complete traits use the `like` suffix. A component whose outer and content
748
+ regions are distinct uses `shell` and `inner`, for example `buttonshell` with
749
+ `buttoninner`, or `datacomponentshell` with `datacomponentinner`. Other public
750
+ families include `inputlike`, `headerlike`, `coloredlike`, `panellike`, and
751
+ `toolbarlike`; the panel and toolbar families also expose
752
+ `panelshell`/`panelinner` and `toolbarshell`/`toolbarinner`. Wrappers are not
753
+ introduced solely to carry a split trait.
754
+
755
+ Themes directly target native elements, public traits, native pseudo-parts,
756
+ and native/ARIA state. They never target `data-fray-component` or `data-part`.
757
+ Every theme seeds inherited variables with a zero-specificity
758
+ `:root`/`[data-theme]` boundary rule. Presentation selectors use `@scope` with
759
+ nested theme roots and `[data-theme-exclude]` limits, a named cascade layer,
760
+ and low-specificity `:where()` selectors. Shiny's highlights and
761
+ select/progress decoration follow that contract and yield to native
762
+ representation under forced colors.
763
+
764
+ `coloredlike` defaults to the primary palette. Components can provide
765
+ `--colored-base`, `--colored-light`, `--colored-dark`, and
766
+ `--colored-contrast`; the active theme decides whether those inputs become a
767
+ flat color, gradient, other polish, or no special treatment.
744
768
 
745
769
  ### Runtime selection
746
770
 
747
771
  `replaceFrayStylesheet` maintains one
748
772
  `link[data-fray-stylesheet="theme"]` and one
749
773
  `link[data-fray-stylesheet="colors"]`. Replacing either link also sets the
750
- corresponding `data-fray-theme` or `data-fray-color` root attribute. The
774
+ corresponding `data-theme` or `data-color` root attribute. The
751
775
  `ThemePicker` and `ColorPicker` controls expose the same operation through the
752
776
  normal Fray value-control contract.
753
777
 
package/colors/README.md CHANGED
@@ -1,15 +1,30 @@
1
1
  # Fray color palettes
2
2
 
3
- Each `<name>/colors.css` file defines the complete `--fray-color-*` contract
4
- without defining component geometry or treatment. It can therefore be replaced
5
- without rebuilding Fray components or replacing the active theme stylesheet.
6
-
7
- Palette files must provide canvas and surface colors, primary and muted text,
8
- ordinary and strong borders, primary/hover/active/soft accents, focus and
9
- selection colors, disabled colors, success/error roles, and highlight/shadow
10
- tints. The required list is available programmatically from
11
- `frayThemeVariableCatalog` entries whose `layer` is `color`.
12
-
13
- Palette names describe a color direction, not a theme. A theme may constrain
14
- which palettes it advertises, but the CSS contract itself keeps the two assets
15
- independently replaceable.
3
+ Each `<name>/colors.css` file defines a replaceable, prefix-free color
4
+ language. It contains palette values only; it does not decide what a panel,
5
+ button, input, selection, or application surface looks like.
6
+
7
+ Every palette supplies three complete ramps:
8
+
9
+ ```text
10
+ --palette-primary-{50,100,200,300,400,500,600,700,800,900,950}
11
+ --palette-secondary-{50,100,200,300,400,500,600,700,800,900,950}
12
+ --palette-neutral-{50,100,200,300,400,500,600,700,800,900,950}
13
+ ```
14
+
15
+ It also supplies `--palette-<family>`, `--palette-<family>-light`, and
16
+ `--palette-<family>-dark` aliases; `--palette-light`, `--palette-dark`,
17
+ `--palette-contrast-light`, and `--palette-contrast-dark`; and named hue
18
+ primitives such as `--palette-red` and `--palette-green`. Additional numeric
19
+ stops may be added without changing the existing contract.
20
+
21
+ Themes map these values to semantic variables. For example, a theme may map a
22
+ light-mode button to `--palette-neutral-100`, a selected item to
23
+ `--palette-primary-600`, and an error to `--palette-red`. A different theme can
24
+ use the same palette in entirely different places.
25
+
26
+ Palette declarations use a zero-specificity boundary selector for `:root` or
27
+ the matching `[data-color]` root. They select no descendants; the custom
28
+ properties propagate through normal inheritance and a nested color root seeds
29
+ its own palette. `frayThemeVariableCatalog` entries whose `layer` is `palette`
30
+ expose the machine-readable required vocabulary.
@@ -1,29 +1,57 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-color="gray"] {
4
- --fray-color-canvas: #f5f6f7;
5
- --fray-color-surface: #ffffff;
6
- --fray-color-surface-muted: #eceff1;
7
- --fray-color-surface-raised: #ffffff;
8
- --fray-color-surface-inset: #dde1e4;
9
- --fray-color-text: #25292d;
10
- --fray-color-text-muted: #626a72;
11
- --fray-color-border: #c3c8cd;
12
- --fray-color-border-strong: #858d95;
13
- --fray-color-primary: #5d6873;
14
- --fray-color-primary-hover: #4d5862;
15
- --fray-color-primary-active: #3d464e;
16
- --fray-color-primary-soft: #e1e6eb;
17
- --fray-color-on-primary: #ffffff;
18
- --fray-color-focus: #1769aa;
19
- --fray-color-selection: #5d6873;
20
- --fray-color-on-selection: #ffffff;
21
- --fray-color-disabled: #e4e7e9;
22
- --fray-color-on-disabled: #6c737a;
23
- --fray-color-error: #b3261e;
24
- --fray-color-on-error: #ffffff;
25
- --fray-color-success: #287a3c;
26
- --fray-color-on-success: #ffffff;
27
- --fray-color-highlight: #ffffff;
28
- --fray-color-shadow: #20252a;
3
+ @layer palette {
4
+ :where(:root:not([data-color]), [data-color="gray"]) {
5
+ --palette-light: #ffffff;
6
+ --palette-dark: #111827;
7
+ --palette-contrast-light: var(--palette-light);
8
+ --palette-contrast-dark: var(--palette-dark);
9
+ --palette-red: #b3261e;
10
+ --palette-green: #287a3c;
11
+
12
+ --palette-primary-500: #5d6873;
13
+ --palette-primary-50: color-mix(in oklch, var(--palette-primary-500) 8%, var(--palette-light));
14
+ --palette-primary-100: color-mix(in oklch, var(--palette-primary-500) 16%, var(--palette-light));
15
+ --palette-primary-200: color-mix(in oklch, var(--palette-primary-500) 32%, var(--palette-light));
16
+ --palette-primary-300: color-mix(in oklch, var(--palette-primary-500) 50%, var(--palette-light));
17
+ --palette-primary-400: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-light));
18
+ --palette-primary-600: color-mix(in oklch, var(--palette-primary-500) 85%, var(--palette-dark));
19
+ --palette-primary-700: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-dark));
20
+ --palette-primary-800: color-mix(in oklch, var(--palette-primary-500) 58%, var(--palette-dark));
21
+ --palette-primary-900: color-mix(in oklch, var(--palette-primary-500) 42%, var(--palette-dark));
22
+ --palette-primary-950: color-mix(in oklch, var(--palette-primary-500) 28%, var(--palette-dark));
23
+ --palette-primary: var(--palette-primary-500);
24
+ --palette-primary-light: var(--palette-primary-200);
25
+ --palette-primary-dark: var(--palette-primary-800);
26
+
27
+ --palette-secondary-500: #1769aa;
28
+ --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-light));
29
+ --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-light));
30
+ --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-light));
31
+ --palette-secondary-300: color-mix(in oklch, var(--palette-secondary-500) 50%, var(--palette-light));
32
+ --palette-secondary-400: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-light));
33
+ --palette-secondary-600: color-mix(in oklch, var(--palette-secondary-500) 85%, var(--palette-dark));
34
+ --palette-secondary-700: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-dark));
35
+ --palette-secondary-800: color-mix(in oklch, var(--palette-secondary-500) 58%, var(--palette-dark));
36
+ --palette-secondary-900: color-mix(in oklch, var(--palette-secondary-500) 42%, var(--palette-dark));
37
+ --palette-secondary-950: color-mix(in oklch, var(--palette-secondary-500) 28%, var(--palette-dark));
38
+ --palette-secondary: var(--palette-secondary-500);
39
+ --palette-secondary-light: var(--palette-secondary-200);
40
+ --palette-secondary-dark: var(--palette-secondary-800);
41
+
42
+ --palette-neutral-500: #858d95;
43
+ --palette-neutral-50: color-mix(in oklch, var(--palette-neutral-500) 6%, var(--palette-light));
44
+ --palette-neutral-100: color-mix(in oklch, var(--palette-neutral-500) 13%, var(--palette-light));
45
+ --palette-neutral-200: color-mix(in oklch, var(--palette-neutral-500) 26%, var(--palette-light));
46
+ --palette-neutral-300: color-mix(in oklch, var(--palette-neutral-500) 43%, var(--palette-light));
47
+ --palette-neutral-400: color-mix(in oklch, var(--palette-neutral-500) 68%, var(--palette-light));
48
+ --palette-neutral-600: color-mix(in oklch, var(--palette-neutral-500) 84%, var(--palette-dark));
49
+ --palette-neutral-700: color-mix(in oklch, var(--palette-neutral-500) 67%, var(--palette-dark));
50
+ --palette-neutral-800: color-mix(in oklch, var(--palette-neutral-500) 50%, var(--palette-dark));
51
+ --palette-neutral-900: color-mix(in oklch, var(--palette-neutral-500) 32%, var(--palette-dark));
52
+ --palette-neutral-950: color-mix(in oklch, var(--palette-neutral-500) 18%, var(--palette-dark));
53
+ --palette-neutral: var(--palette-neutral-500);
54
+ --palette-neutral-light: var(--palette-neutral-200);
55
+ --palette-neutral-dark: var(--palette-neutral-800);
56
+ }
29
57
  }
@@ -1,29 +1,57 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-color="green"] {
4
- --fray-color-canvas: #f4faf4;
5
- --fray-color-surface: #ffffff;
6
- --fray-color-surface-muted: #e6f3e7;
7
- --fray-color-surface-raised: #ffffff;
8
- --fray-color-surface-inset: #d2e7d4;
9
- --fray-color-text: #18301d;
10
- --fray-color-text-muted: #536b57;
11
- --fray-color-border: #b4ccb8;
12
- --fray-color-border-strong: #75947a;
13
- --fray-color-primary: #287a3c;
14
- --fray-color-primary-hover: #206b33;
15
- --fray-color-primary-active: #185529;
16
- --fray-color-primary-soft: #d5f0da;
17
- --fray-color-on-primary: #ffffff;
18
- --fray-color-focus: #19883a;
19
- --fray-color-selection: #287a3c;
20
- --fray-color-on-selection: #ffffff;
21
- --fray-color-disabled: #e0e9e1;
22
- --fray-color-on-disabled: #657968;
23
- --fray-color-error: #b3261e;
24
- --fray-color-on-error: #ffffff;
25
- --fray-color-success: #287a3c;
26
- --fray-color-on-success: #ffffff;
27
- --fray-color-highlight: #ffffff;
28
- --fray-color-shadow: #15321b;
3
+ @layer palette {
4
+ :where(:root:not([data-color]), [data-color="green"]) {
5
+ --palette-light: #ffffff;
6
+ --palette-dark: #111827;
7
+ --palette-contrast-light: var(--palette-light);
8
+ --palette-contrast-dark: var(--palette-dark);
9
+ --palette-red: #b3261e;
10
+ --palette-green: #287a3c;
11
+
12
+ --palette-primary-500: #287a3c;
13
+ --palette-primary-50: color-mix(in oklch, var(--palette-primary-500) 8%, var(--palette-light));
14
+ --palette-primary-100: color-mix(in oklch, var(--palette-primary-500) 16%, var(--palette-light));
15
+ --palette-primary-200: color-mix(in oklch, var(--palette-primary-500) 32%, var(--palette-light));
16
+ --palette-primary-300: color-mix(in oklch, var(--palette-primary-500) 50%, var(--palette-light));
17
+ --palette-primary-400: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-light));
18
+ --palette-primary-600: color-mix(in oklch, var(--palette-primary-500) 85%, var(--palette-dark));
19
+ --palette-primary-700: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-dark));
20
+ --palette-primary-800: color-mix(in oklch, var(--palette-primary-500) 58%, var(--palette-dark));
21
+ --palette-primary-900: color-mix(in oklch, var(--palette-primary-500) 42%, var(--palette-dark));
22
+ --palette-primary-950: color-mix(in oklch, var(--palette-primary-500) 28%, var(--palette-dark));
23
+ --palette-primary: var(--palette-primary-500);
24
+ --palette-primary-light: var(--palette-primary-200);
25
+ --palette-primary-dark: var(--palette-primary-800);
26
+
27
+ --palette-secondary-500: #087f78;
28
+ --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-light));
29
+ --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-light));
30
+ --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-light));
31
+ --palette-secondary-300: color-mix(in oklch, var(--palette-secondary-500) 50%, var(--palette-light));
32
+ --palette-secondary-400: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-light));
33
+ --palette-secondary-600: color-mix(in oklch, var(--palette-secondary-500) 85%, var(--palette-dark));
34
+ --palette-secondary-700: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-dark));
35
+ --palette-secondary-800: color-mix(in oklch, var(--palette-secondary-500) 58%, var(--palette-dark));
36
+ --palette-secondary-900: color-mix(in oklch, var(--palette-secondary-500) 42%, var(--palette-dark));
37
+ --palette-secondary-950: color-mix(in oklch, var(--palette-secondary-500) 28%, var(--palette-dark));
38
+ --palette-secondary: var(--palette-secondary-500);
39
+ --palette-secondary-light: var(--palette-secondary-200);
40
+ --palette-secondary-dark: var(--palette-secondary-800);
41
+
42
+ --palette-neutral-500: #75947a;
43
+ --palette-neutral-50: color-mix(in oklch, var(--palette-neutral-500) 6%, var(--palette-light));
44
+ --palette-neutral-100: color-mix(in oklch, var(--palette-neutral-500) 13%, var(--palette-light));
45
+ --palette-neutral-200: color-mix(in oklch, var(--palette-neutral-500) 26%, var(--palette-light));
46
+ --palette-neutral-300: color-mix(in oklch, var(--palette-neutral-500) 43%, var(--palette-light));
47
+ --palette-neutral-400: color-mix(in oklch, var(--palette-neutral-500) 68%, var(--palette-light));
48
+ --palette-neutral-600: color-mix(in oklch, var(--palette-neutral-500) 84%, var(--palette-dark));
49
+ --palette-neutral-700: color-mix(in oklch, var(--palette-neutral-500) 67%, var(--palette-dark));
50
+ --palette-neutral-800: color-mix(in oklch, var(--palette-neutral-500) 50%, var(--palette-dark));
51
+ --palette-neutral-900: color-mix(in oklch, var(--palette-neutral-500) 32%, var(--palette-dark));
52
+ --palette-neutral-950: color-mix(in oklch, var(--palette-neutral-500) 18%, var(--palette-dark));
53
+ --palette-neutral: var(--palette-neutral-500);
54
+ --palette-neutral-light: var(--palette-neutral-200);
55
+ --palette-neutral-dark: var(--palette-neutral-800);
56
+ }
29
57
  }
@@ -1,29 +1,57 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-color="iceblue"] {
4
- --fray-color-canvas: #f4f8fc;
5
- --fray-color-surface: #ffffff;
6
- --fray-color-surface-muted: #eaf2f9;
7
- --fray-color-surface-raised: #ffffff;
8
- --fray-color-surface-inset: #d9e7f3;
9
- --fray-color-text: #162536;
10
- --fray-color-text-muted: #53687c;
11
- --fray-color-border: #b8c9d9;
12
- --fray-color-border-strong: #7892aa;
13
- --fray-color-primary: #1769aa;
14
- --fray-color-primary-hover: #0f5b96;
15
- --fray-color-primary-active: #0a4778;
16
- --fray-color-primary-soft: #d7ebfb;
17
- --fray-color-on-primary: #ffffff;
18
- --fray-color-focus: #1683d8;
19
- --fray-color-selection: #1769aa;
20
- --fray-color-on-selection: #ffffff;
21
- --fray-color-disabled: #e2e9ef;
22
- --fray-color-on-disabled: #697a89;
23
- --fray-color-error: #b3261e;
24
- --fray-color-on-error: #ffffff;
25
- --fray-color-success: #287a3c;
26
- --fray-color-on-success: #ffffff;
27
- --fray-color-highlight: #ffffff;
28
- --fray-color-shadow: #11283d;
3
+ @layer palette {
4
+ :where(:root:not([data-color]), [data-color="iceblue"]) {
5
+ --palette-light: #ffffff;
6
+ --palette-dark: #111827;
7
+ --palette-contrast-light: var(--palette-light);
8
+ --palette-contrast-dark: var(--palette-dark);
9
+ --palette-red: #b3261e;
10
+ --palette-green: #287a3c;
11
+
12
+ --palette-primary-500: #1769aa;
13
+ --palette-primary-50: color-mix(in oklch, var(--palette-primary-500) 8%, var(--palette-light));
14
+ --palette-primary-100: color-mix(in oklch, var(--palette-primary-500) 16%, var(--palette-light));
15
+ --palette-primary-200: color-mix(in oklch, var(--palette-primary-500) 32%, var(--palette-light));
16
+ --palette-primary-300: color-mix(in oklch, var(--palette-primary-500) 50%, var(--palette-light));
17
+ --palette-primary-400: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-light));
18
+ --palette-primary-600: color-mix(in oklch, var(--palette-primary-500) 85%, var(--palette-dark));
19
+ --palette-primary-700: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-dark));
20
+ --palette-primary-800: color-mix(in oklch, var(--palette-primary-500) 58%, var(--palette-dark));
21
+ --palette-primary-900: color-mix(in oklch, var(--palette-primary-500) 42%, var(--palette-dark));
22
+ --palette-primary-950: color-mix(in oklch, var(--palette-primary-500) 28%, var(--palette-dark));
23
+ --palette-primary: var(--palette-primary-500);
24
+ --palette-primary-light: var(--palette-primary-200);
25
+ --palette-primary-dark: var(--palette-primary-800);
26
+
27
+ --palette-secondary-500: #7137a8;
28
+ --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-light));
29
+ --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-light));
30
+ --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-light));
31
+ --palette-secondary-300: color-mix(in oklch, var(--palette-secondary-500) 50%, var(--palette-light));
32
+ --palette-secondary-400: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-light));
33
+ --palette-secondary-600: color-mix(in oklch, var(--palette-secondary-500) 85%, var(--palette-dark));
34
+ --palette-secondary-700: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-dark));
35
+ --palette-secondary-800: color-mix(in oklch, var(--palette-secondary-500) 58%, var(--palette-dark));
36
+ --palette-secondary-900: color-mix(in oklch, var(--palette-secondary-500) 42%, var(--palette-dark));
37
+ --palette-secondary-950: color-mix(in oklch, var(--palette-secondary-500) 28%, var(--palette-dark));
38
+ --palette-secondary: var(--palette-secondary-500);
39
+ --palette-secondary-light: var(--palette-secondary-200);
40
+ --palette-secondary-dark: var(--palette-secondary-800);
41
+
42
+ --palette-neutral-500: #7892aa;
43
+ --palette-neutral-50: color-mix(in oklch, var(--palette-neutral-500) 6%, var(--palette-light));
44
+ --palette-neutral-100: color-mix(in oklch, var(--palette-neutral-500) 13%, var(--palette-light));
45
+ --palette-neutral-200: color-mix(in oklch, var(--palette-neutral-500) 26%, var(--palette-light));
46
+ --palette-neutral-300: color-mix(in oklch, var(--palette-neutral-500) 43%, var(--palette-light));
47
+ --palette-neutral-400: color-mix(in oklch, var(--palette-neutral-500) 68%, var(--palette-light));
48
+ --palette-neutral-600: color-mix(in oklch, var(--palette-neutral-500) 84%, var(--palette-dark));
49
+ --palette-neutral-700: color-mix(in oklch, var(--palette-neutral-500) 67%, var(--palette-dark));
50
+ --palette-neutral-800: color-mix(in oklch, var(--palette-neutral-500) 50%, var(--palette-dark));
51
+ --palette-neutral-900: color-mix(in oklch, var(--palette-neutral-500) 32%, var(--palette-dark));
52
+ --palette-neutral-950: color-mix(in oklch, var(--palette-neutral-500) 18%, var(--palette-dark));
53
+ --palette-neutral: var(--palette-neutral-500);
54
+ --palette-neutral-light: var(--palette-neutral-200);
55
+ --palette-neutral-dark: var(--palette-neutral-800);
56
+ }
29
57
  }
@@ -1,29 +1,57 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-color="ocean"] {
4
- --fray-color-canvas: #f1f9f8;
5
- --fray-color-surface: #ffffff;
6
- --fray-color-surface-muted: #e1f2f0;
7
- --fray-color-surface-raised: #ffffff;
8
- --fray-color-surface-inset: #cbe5e2;
9
- --fray-color-text: #12302f;
10
- --fray-color-text-muted: #4e6b69;
11
- --fray-color-border: #a9c9c5;
12
- --fray-color-border-strong: #668f8a;
13
- --fray-color-primary: #087f78;
14
- --fray-color-primary-hover: #006f69;
15
- --fray-color-primary-active: #005a55;
16
- --fray-color-primary-soft: #c8efeb;
17
- --fray-color-on-primary: #ffffff;
18
- --fray-color-focus: #008f86;
19
- --fray-color-selection: #087f78;
20
- --fray-color-on-selection: #ffffff;
21
- --fray-color-disabled: #dde9e7;
22
- --fray-color-on-disabled: #637976;
23
- --fray-color-error: #b3261e;
24
- --fray-color-on-error: #ffffff;
25
- --fray-color-success: #287a3c;
26
- --fray-color-on-success: #ffffff;
27
- --fray-color-highlight: #ffffff;
28
- --fray-color-shadow: #0b302d;
3
+ @layer palette {
4
+ :where(:root:not([data-color]), [data-color="ocean"]) {
5
+ --palette-light: #ffffff;
6
+ --palette-dark: #111827;
7
+ --palette-contrast-light: var(--palette-light);
8
+ --palette-contrast-dark: var(--palette-dark);
9
+ --palette-red: #b3261e;
10
+ --palette-green: #287a3c;
11
+
12
+ --palette-primary-500: #087f78;
13
+ --palette-primary-50: color-mix(in oklch, var(--palette-primary-500) 8%, var(--palette-light));
14
+ --palette-primary-100: color-mix(in oklch, var(--palette-primary-500) 16%, var(--palette-light));
15
+ --palette-primary-200: color-mix(in oklch, var(--palette-primary-500) 32%, var(--palette-light));
16
+ --palette-primary-300: color-mix(in oklch, var(--palette-primary-500) 50%, var(--palette-light));
17
+ --palette-primary-400: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-light));
18
+ --palette-primary-600: color-mix(in oklch, var(--palette-primary-500) 85%, var(--palette-dark));
19
+ --palette-primary-700: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-dark));
20
+ --palette-primary-800: color-mix(in oklch, var(--palette-primary-500) 58%, var(--palette-dark));
21
+ --palette-primary-900: color-mix(in oklch, var(--palette-primary-500) 42%, var(--palette-dark));
22
+ --palette-primary-950: color-mix(in oklch, var(--palette-primary-500) 28%, var(--palette-dark));
23
+ --palette-primary: var(--palette-primary-500);
24
+ --palette-primary-light: var(--palette-primary-200);
25
+ --palette-primary-dark: var(--palette-primary-800);
26
+
27
+ --palette-secondary-500: #1769aa;
28
+ --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-light));
29
+ --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-light));
30
+ --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-light));
31
+ --palette-secondary-300: color-mix(in oklch, var(--palette-secondary-500) 50%, var(--palette-light));
32
+ --palette-secondary-400: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-light));
33
+ --palette-secondary-600: color-mix(in oklch, var(--palette-secondary-500) 85%, var(--palette-dark));
34
+ --palette-secondary-700: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-dark));
35
+ --palette-secondary-800: color-mix(in oklch, var(--palette-secondary-500) 58%, var(--palette-dark));
36
+ --palette-secondary-900: color-mix(in oklch, var(--palette-secondary-500) 42%, var(--palette-dark));
37
+ --palette-secondary-950: color-mix(in oklch, var(--palette-secondary-500) 28%, var(--palette-dark));
38
+ --palette-secondary: var(--palette-secondary-500);
39
+ --palette-secondary-light: var(--palette-secondary-200);
40
+ --palette-secondary-dark: var(--palette-secondary-800);
41
+
42
+ --palette-neutral-500: #668f8a;
43
+ --palette-neutral-50: color-mix(in oklch, var(--palette-neutral-500) 6%, var(--palette-light));
44
+ --palette-neutral-100: color-mix(in oklch, var(--palette-neutral-500) 13%, var(--palette-light));
45
+ --palette-neutral-200: color-mix(in oklch, var(--palette-neutral-500) 26%, var(--palette-light));
46
+ --palette-neutral-300: color-mix(in oklch, var(--palette-neutral-500) 43%, var(--palette-light));
47
+ --palette-neutral-400: color-mix(in oklch, var(--palette-neutral-500) 68%, var(--palette-light));
48
+ --palette-neutral-600: color-mix(in oklch, var(--palette-neutral-500) 84%, var(--palette-dark));
49
+ --palette-neutral-700: color-mix(in oklch, var(--palette-neutral-500) 67%, var(--palette-dark));
50
+ --palette-neutral-800: color-mix(in oklch, var(--palette-neutral-500) 50%, var(--palette-dark));
51
+ --palette-neutral-900: color-mix(in oklch, var(--palette-neutral-500) 32%, var(--palette-dark));
52
+ --palette-neutral-950: color-mix(in oklch, var(--palette-neutral-500) 18%, var(--palette-dark));
53
+ --palette-neutral: var(--palette-neutral-500);
54
+ --palette-neutral-light: var(--palette-neutral-200);
55
+ --palette-neutral-dark: var(--palette-neutral-800);
56
+ }
29
57
  }
@@ -1,29 +1,57 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-color="orange"] {
4
- --fray-color-canvas: #fcf7f2;
5
- --fray-color-surface: #ffffff;
6
- --fray-color-surface-muted: #f8ebdf;
7
- --fray-color-surface-raised: #ffffff;
8
- --fray-color-surface-inset: #edd8c5;
9
- --fray-color-text: #382417;
10
- --fray-color-text-muted: #725b49;
11
- --fray-color-border: #d8bda5;
12
- --fray-color-border-strong: #a87a56;
13
- --fray-color-primary: #a94b00;
14
- --fray-color-primary-hover: #963f00;
15
- --fray-color-primary-active: #773200;
16
- --fray-color-primary-soft: #f8dfc8;
17
- --fray-color-on-primary: #ffffff;
18
- --fray-color-focus: #c45800;
19
- --fray-color-selection: #a94b00;
20
- --fray-color-on-selection: #ffffff;
21
- --fray-color-disabled: #eee4dc;
22
- --fray-color-on-disabled: #786a5f;
23
- --fray-color-error: #a51f18;
24
- --fray-color-on-error: #ffffff;
25
- --fray-color-success: #287a3c;
26
- --fray-color-on-success: #ffffff;
27
- --fray-color-highlight: #ffffff;
28
- --fray-color-shadow: #3a1c08;
3
+ @layer palette {
4
+ :where(:root:not([data-color]), [data-color="orange"]) {
5
+ --palette-light: #ffffff;
6
+ --palette-dark: #111827;
7
+ --palette-contrast-light: var(--palette-light);
8
+ --palette-contrast-dark: var(--palette-dark);
9
+ --palette-red: #b3261e;
10
+ --palette-green: #287a3c;
11
+
12
+ --palette-primary-500: #a94b00;
13
+ --palette-primary-50: color-mix(in oklch, var(--palette-primary-500) 8%, var(--palette-light));
14
+ --palette-primary-100: color-mix(in oklch, var(--palette-primary-500) 16%, var(--palette-light));
15
+ --palette-primary-200: color-mix(in oklch, var(--palette-primary-500) 32%, var(--palette-light));
16
+ --palette-primary-300: color-mix(in oklch, var(--palette-primary-500) 50%, var(--palette-light));
17
+ --palette-primary-400: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-light));
18
+ --palette-primary-600: color-mix(in oklch, var(--palette-primary-500) 85%, var(--palette-dark));
19
+ --palette-primary-700: color-mix(in oklch, var(--palette-primary-500) 72%, var(--palette-dark));
20
+ --palette-primary-800: color-mix(in oklch, var(--palette-primary-500) 58%, var(--palette-dark));
21
+ --palette-primary-900: color-mix(in oklch, var(--palette-primary-500) 42%, var(--palette-dark));
22
+ --palette-primary-950: color-mix(in oklch, var(--palette-primary-500) 28%, var(--palette-dark));
23
+ --palette-primary: var(--palette-primary-500);
24
+ --palette-primary-light: var(--palette-primary-200);
25
+ --palette-primary-dark: var(--palette-primary-800);
26
+
27
+ --palette-secondary-500: #7137a8;
28
+ --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-light));
29
+ --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-light));
30
+ --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-light));
31
+ --palette-secondary-300: color-mix(in oklch, var(--palette-secondary-500) 50%, var(--palette-light));
32
+ --palette-secondary-400: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-light));
33
+ --palette-secondary-600: color-mix(in oklch, var(--palette-secondary-500) 85%, var(--palette-dark));
34
+ --palette-secondary-700: color-mix(in oklch, var(--palette-secondary-500) 72%, var(--palette-dark));
35
+ --palette-secondary-800: color-mix(in oklch, var(--palette-secondary-500) 58%, var(--palette-dark));
36
+ --palette-secondary-900: color-mix(in oklch, var(--palette-secondary-500) 42%, var(--palette-dark));
37
+ --palette-secondary-950: color-mix(in oklch, var(--palette-secondary-500) 28%, var(--palette-dark));
38
+ --palette-secondary: var(--palette-secondary-500);
39
+ --palette-secondary-light: var(--palette-secondary-200);
40
+ --palette-secondary-dark: var(--palette-secondary-800);
41
+
42
+ --palette-neutral-500: #a87a56;
43
+ --palette-neutral-50: color-mix(in oklch, var(--palette-neutral-500) 6%, var(--palette-light));
44
+ --palette-neutral-100: color-mix(in oklch, var(--palette-neutral-500) 13%, var(--palette-light));
45
+ --palette-neutral-200: color-mix(in oklch, var(--palette-neutral-500) 26%, var(--palette-light));
46
+ --palette-neutral-300: color-mix(in oklch, var(--palette-neutral-500) 43%, var(--palette-light));
47
+ --palette-neutral-400: color-mix(in oklch, var(--palette-neutral-500) 68%, var(--palette-light));
48
+ --palette-neutral-600: color-mix(in oklch, var(--palette-neutral-500) 84%, var(--palette-dark));
49
+ --palette-neutral-700: color-mix(in oklch, var(--palette-neutral-500) 67%, var(--palette-dark));
50
+ --palette-neutral-800: color-mix(in oklch, var(--palette-neutral-500) 50%, var(--palette-dark));
51
+ --palette-neutral-900: color-mix(in oklch, var(--palette-neutral-500) 32%, var(--palette-dark));
52
+ --palette-neutral-950: color-mix(in oklch, var(--palette-neutral-500) 18%, var(--palette-dark));
53
+ --palette-neutral: var(--palette-neutral-500);
54
+ --palette-neutral-light: var(--palette-neutral-200);
55
+ --palette-neutral-dark: var(--palette-neutral-800);
56
+ }
29
57
  }