@crisp-ui-kit/crisp 0.33.0 → 0.33.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 (110) hide show
  1. package/README.md +33 -1
  2. package/dist/appshell.css +1 -4
  3. package/dist/appshell.layered.css +1 -4
  4. package/dist/authshell.css +4 -19
  5. package/dist/authshell.layered.css +4 -19
  6. package/dist/avatar.css +2 -1
  7. package/dist/avatar.layered.css +2 -1
  8. package/dist/board.css +1 -4
  9. package/dist/board.layered.css +1 -4
  10. package/dist/breadcrumb.css +0 -1
  11. package/dist/breadcrumb.layered.css +0 -1
  12. package/dist/button.css +14 -6
  13. package/dist/button.layered.css +14 -6
  14. package/dist/card.css +2 -1
  15. package/dist/card.layered.css +2 -1
  16. package/dist/checkbox.css +6 -9
  17. package/dist/checkbox.layered.css +6 -9
  18. package/dist/cjs/components/avatar/avatar.recipe.js +38 -19
  19. package/dist/cjs/components/button/button.recipe.js +109 -18
  20. package/dist/cjs/components/datatable/datatable.js +14 -2
  21. package/dist/cjs/components/datatable/datatable.recipe.js +5 -0
  22. package/dist/cjs/components/switch/switch.recipe.js +48 -18
  23. package/dist/columncalc.css +2 -6
  24. package/dist/columncalc.layered.css +2 -6
  25. package/dist/command.css +9 -11
  26. package/dist/command.layered.css +9 -11
  27. package/dist/datatable.css +11 -19
  28. package/dist/datatable.layered.css +11 -19
  29. package/dist/datepicker.css +15 -80
  30. package/dist/datepicker.layered.css +15 -80
  31. package/dist/datepickerfield.css +3 -18
  32. package/dist/datepickerfield.layered.css +3 -18
  33. package/dist/donutchart.css +1 -2
  34. package/dist/donutchart.layered.css +1 -2
  35. package/dist/entitycard.css +1 -7
  36. package/dist/entitycard.layered.css +1 -7
  37. package/dist/esm/components/avatar/avatar.recipe.js +38 -19
  38. package/dist/esm/components/button/button.recipe.js +109 -18
  39. package/dist/esm/components/datatable/datatable.js +14 -2
  40. package/dist/esm/components/datatable/datatable.recipe.js +5 -0
  41. package/dist/esm/components/switch/switch.recipe.js +48 -18
  42. package/dist/fileupload.css +10 -60
  43. package/dist/fileupload.layered.css +10 -60
  44. package/dist/inbox.css +1 -7
  45. package/dist/inbox.layered.css +1 -7
  46. package/dist/input.css +9 -20
  47. package/dist/input.layered.css +9 -20
  48. package/dist/listpage.css +2 -12
  49. package/dist/listpage.layered.css +2 -12
  50. package/dist/menu.css +3 -19
  51. package/dist/menu.layered.css +3 -19
  52. package/dist/multiselect.css +4 -25
  53. package/dist/multiselect.layered.css +4 -25
  54. package/dist/navitem.css +5 -13
  55. package/dist/navitem.layered.css +5 -13
  56. package/dist/onboarding.css +1 -8
  57. package/dist/onboarding.layered.css +1 -8
  58. package/dist/quantitypicker.css +15 -50
  59. package/dist/quantitypicker.layered.css +15 -50
  60. package/dist/radiogroup.css +1 -6
  61. package/dist/radiogroup.layered.css +1 -6
  62. package/dist/recordpage.css +2 -10
  63. package/dist/recordpage.layered.css +2 -10
  64. package/dist/recordpanel.css +1 -13
  65. package/dist/recordpanel.layered.css +1 -13
  66. package/dist/recordstable.css +2 -11
  67. package/dist/recordstable.layered.css +2 -11
  68. package/dist/resizablepanel.css +4 -15
  69. package/dist/resizablepanel.layered.css +4 -15
  70. package/dist/richtext.css +1 -5
  71. package/dist/richtext.layered.css +1 -5
  72. package/dist/select.css +7 -30
  73. package/dist/select.layered.css +7 -30
  74. package/dist/settingsshell.css +2 -7
  75. package/dist/settingsshell.layered.css +2 -7
  76. package/dist/sidebar.css +23 -28
  77. package/dist/sidebar.layered.css +23 -28
  78. package/dist/slider.css +1 -8
  79. package/dist/slider.layered.css +1 -8
  80. package/dist/statcard.css +1 -2
  81. package/dist/statcard.layered.css +1 -2
  82. package/dist/styles.css +196 -652
  83. package/dist/styles.layered.css +196 -652
  84. package/dist/switch.css +1 -5
  85. package/dist/switch.layered.css +1 -5
  86. package/dist/table.css +2 -1
  87. package/dist/table.layered.css +2 -1
  88. package/dist/tabletoolbar.css +1 -3
  89. package/dist/tabletoolbar.layered.css +1 -3
  90. package/dist/tabs.css +1 -5
  91. package/dist/tabs.layered.css +1 -5
  92. package/dist/tasklist.css +1 -8
  93. package/dist/tasklist.layered.css +1 -8
  94. package/dist/textarea.css +2 -13
  95. package/dist/textarea.layered.css +2 -13
  96. package/dist/tooltip.css +2 -1
  97. package/dist/tooltip.layered.css +2 -1
  98. package/dist/trialbanner.css +2 -11
  99. package/dist/trialbanner.layered.css +2 -11
  100. package/dist/types/components/avatar/avatar.d.ts +30 -30
  101. package/dist/types/components/avatar/avatar.recipe.d.ts +136 -49
  102. package/dist/types/components/button/button.d.ts +30 -30
  103. package/dist/types/components/button/button.recipe.d.ts +193 -45
  104. package/dist/types/components/datatable/datatable.d.ts +10 -1
  105. package/dist/types/components/switch/switch.recipe.d.ts +57 -3
  106. package/dist/viewtoggle.css +3 -9
  107. package/dist/viewtoggle.layered.css +3 -9
  108. package/dist/wheelpicker.css +14 -59
  109. package/dist/wheelpicker.layered.css +14 -59
  110. package/package.json +1 -1
package/README.md CHANGED
@@ -43,6 +43,10 @@ import "@crisp-ui-kit/crisp/base.css"; // optional app baseline
43
43
  import "@crisp-ui-kit/crisp/styles.css";
44
44
  ```
45
45
 
46
+ If your own styles need to beat crisp's, import `@crisp-ui-kit/crisp/styles.layered.css`
47
+ instead of `styles.css`. It is the same CSS wrapped in `@layer crisp-components`, and anything
48
+ you write outside a layer wins over anything inside one regardless of specificity or order.
49
+
46
50
  `base.css` is optional: it sets `body`'s font, background, and text color from
47
51
  crisp's own tokens (plus box-sizing and `color-scheme`), so a fresh app doesn't
48
52
  render Times New Roman on a transparent background. Import it first, before
@@ -86,11 +90,39 @@ import { contract as c } from "@crisp-ui-kit/crisp";
86
90
  const styles = { padding: c.space["4"], borderRadius: c.radius.md };
87
91
  ```
88
92
 
89
- ### Building your own recipe
93
+ ### Building your own component
90
94
 
91
95
  The same primitives the kit is built on are exported (`defineRecipe`, `resolveRecipe`,
92
96
  `Primitive`) so you can author components in the same style.
93
97
 
98
+ For new components, prefer **`defineSpec`**: it takes the same styling as *data* — named slots
99
+ with typed declarations — rather than as a CSS string, and `specToRecipe` compiles it to the
100
+ recipe everything else already understands.
101
+
102
+ ```tsx
103
+ import { defineSpec, resolveRecipe, specToRecipe, contract as c } from "@crisp-ui-kit/crisp";
104
+
105
+ const spec = defineSpec({
106
+ name: "callout-lite",
107
+ base: { display: "flex", gap: c.space["2"], borderRadius: c.radius.md },
108
+ parts: [{ slot: "icon", selector: "& .icon", decls: { flexShrink: 0 } }],
109
+ variants: {
110
+ tone: {
111
+ neutral: { background: c.bgRaised, color: c.fgMuted },
112
+ danger: { background: c.bgDanger, color: c.fgOnTone },
113
+ },
114
+ },
115
+ defaultVariants: { tone: "neutral" },
116
+ });
117
+
118
+ export const calloutLite = resolveRecipe(specToRecipe(spec));
119
+ ```
120
+
121
+ The variant keys survive into the type, so `VariantProps<typeof calloutLite>["tone"]` is
122
+ `"neutral" | "danger"` and not `string`. A string recipe can only be rewritten and hoped over;
123
+ a spec can be *read*, which is what lets a non-CSS target refuse a property it cannot express
124
+ instead of silently dropping it. crisp's own primitives are moving to it component by component.
125
+
94
126
  ## Documentation
95
127
 
96
128
  The docs site renders a live, measured demo for every component. Run it locally:
package/dist/appshell.css CHANGED
@@ -1,6 +1,5 @@
1
1
  .crisp-appshell {
2
-
3
- display: flex; height: 100%; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
2
+ display: flex; height: 100%; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4
3
  & .crisp-appshell-side { position: relative; flex-shrink: 0; overflow: hidden; }
5
4
  & .crisp-appshell-side-inner { height: 100%; }
6
5
  & .crisp-appshell-resize { position: absolute; top: 0; inset-inline-end: 0; width: 10px; height: 100%; cursor: col-resize; z-index: 5; touch-action: none; }
@@ -9,9 +8,7 @@
9
8
  & .crisp-appshell-main { position: relative; flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }
10
9
  & .crisp-appshell-expand { position: absolute; top: var(--crisp-space-2); inset-inline-start: var(--crisp-space-2); z-index: 6; display: inline-flex; align-items: center; justify-content: center; width: var(--crisp-size-row); height: var(--crisp-size-row); padding: 0; border: none; border-radius: var(--crisp-radius-md); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); background: var(--crisp-bg-surface); color: var(--crisp-fg-muted); font-family: inherit; cursor: pointer; transition: background-color .12s; }
11
10
  & .crisp-appshell-expand:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
12
-
13
11
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
14
-
15
12
  }
16
13
 
17
14
  @media (prefers-reduced-motion: reduce) {
@@ -1,7 +1,6 @@
1
1
  @layer crisp-components {
2
2
  .crisp-appshell {
3
-
4
- display: flex; height: 100%; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
3
+ display: flex; height: 100%; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
5
4
  & .crisp-appshell-side { position: relative; flex-shrink: 0; overflow: hidden; }
6
5
  & .crisp-appshell-side-inner { height: 100%; }
7
6
  & .crisp-appshell-resize { position: absolute; top: 0; inset-inline-end: 0; width: 10px; height: 100%; cursor: col-resize; z-index: 5; touch-action: none; }
@@ -10,9 +9,7 @@
10
9
  & .crisp-appshell-main { position: relative; flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }
11
10
  & .crisp-appshell-expand { position: absolute; top: var(--crisp-space-2); inset-inline-start: var(--crisp-space-2); z-index: 6; display: inline-flex; align-items: center; justify-content: center; width: var(--crisp-size-row); height: var(--crisp-size-row); padding: 0; border: none; border-radius: var(--crisp-radius-md); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); background: var(--crisp-bg-surface); color: var(--crisp-fg-muted); font-family: inherit; cursor: pointer; transition: background-color .12s; }
12
11
  & .crisp-appshell-expand:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
13
-
14
12
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
15
-
16
13
  }
17
14
 
18
15
  @media (prefers-reduced-motion: reduce) {
@@ -1,31 +1,18 @@
1
1
  .crisp-authshell {
2
- min-height: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; position: relative;
3
- background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary);
4
- -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
5
-
2
+ min-height: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; position: relative; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
6
3
  & .crisp-authshell-progress { position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: var(--crisp-border-default); }
7
4
  & .crisp-authshell-progress-fill { height: 2px; background: var(--crisp-fg-primary); border-radius: 4px; transition: width .2s; }
8
-
9
5
  & .crisp-authshell-logo { margin-top: var(--crisp-space-8); height: 24px; display: flex; align-items: center; }
10
-
11
6
  & .crisp-authshell-card { margin-top: var(--crisp-space-6); display: flex; height: 692px; border-radius: 20px; border: 1px solid var(--crisp-border-subtle); overflow: hidden; }
12
-
13
7
  & .crisp-authshell-pane { flex: 0 0 564px; padding: 72px; display: flex; flex-direction: column; box-sizing: border-box; }
14
-
15
8
  & .crisp-authshell-preview { flex: 0 0 564px; padding: 96px 64px; background: var(--crisp-bg-subtle); border-inline-start: 1px solid color-mix(in srgb, var(--crisp-fg-primary) 5%, transparent); position: relative; overflow: hidden; box-sizing: border-box; }
16
9
  & .crisp-authshell-preview::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 120px; background: linear-gradient(color-mix(in srgb, var(--crisp-bg-subtle) 0%, transparent) 0%, var(--crisp-bg-subtle) 100%); pointer-events: none; }
17
-
18
10
  & .crisp-authshell-body { width: 420px; margin: 0 auto; display: flex; flex-direction: column; gap: var(--crisp-space-8); align-items: center; }
19
-
20
11
  & .crisp-authshell-title { font-size: 20px; line-height: 24px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.4px; color: var(--crisp-fg-primary); align-self: stretch; }
21
-
22
12
  & .crisp-authshell-form { align-self: stretch; display: flex; flex-direction: column; gap: 28px; }
23
-
24
13
  & .crisp-authshell-footer { margin-top: var(--crisp-space-6); display: flex; align-items: center; gap: var(--crisp-space-1); font-size: var(--crisp-text-sm); line-height: 16px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
25
14
  & .crisp-authshell-footer a { color: inherit; font-weight: var(--crisp-weight-medium); text-decoration: underline; }
26
-
27
- /* Auth-surface control treatment: flatter than the in-app chrome — a plain
28
- hairline ring instead of elevation.field's soft glow, and a 36px (not
15
+ /* Auth-surface control treatment: flatter than the in-app chrome — a plain hairline ring instead of elevation.field's soft glow, and a 36px (not
29
16
  40px) submit. Scoped to .crisp-authshell-body so a consumer keeps using
30
17
  crisp's Input / FormField / Button and gets the auth treatment for free. */
31
18
  & .crisp-authshell-body .crisp-formfield-label { font-size: var(--crisp-text-sm); line-height: 16px; font-weight: var(--crisp-weight-medium); letter-spacing: -0.12px; color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent); padding-inline-start: var(--crisp-space-1); }
@@ -33,8 +20,7 @@
33
20
  & .crisp-authshell-body .crisp-input { height: 34px; padding-inline: var(--crisp-space-2-5); border-radius: 10px; background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; transition: box-shadow .14s, background-color .14s; }
34
21
  & .crisp-authshell-body .crisp-input:focus { box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); }
35
22
  /* Same three-layer brand shadow as Button's primary intent, but the auth
36
- button's inset ring is measured at rgba(0,0,0,0.06) — a hairline, not
37
- the in-app button's rgba(255,255,255,0.07) highlight. */
23
+ button's inset ring is measured at rgba(0,0,0,0.06) — a hairline, not the in-app button's rgba(255,255,255,0.07) highlight. */
38
24
  & .crisp-authshell-body .crisp-button { height: 36px; padding-inline: var(--crisp-space-3); border-radius: 10px; }
39
25
  & .crisp-authshell-body .crisp-button--intent_primary { box-shadow: inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); }
40
26
 
@@ -43,8 +29,7 @@
43
29
  that bracket, not a measured value. A CONTAINER query, not a media
44
30
  query: the shell is embedded in the docs inside an ~800px column, where
45
31
  a viewport query would keep the 1130px card and overflow it. Asking the
46
- shell's own width is what "there isn't room for the preview" means. */
47
- container-type: inline-size;
32
+ shell's own width is what "there isn't room for the preview" means. */ container-type: inline-size;
48
33
  @container (max-width: 1200px) { & .crisp-authshell-preview { display: none; } }
49
34
  }
50
35
 
@@ -1,32 +1,19 @@
1
1
  @layer crisp-components {
2
2
  .crisp-authshell {
3
- min-height: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; position: relative;
4
- background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary);
5
- -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
6
-
3
+ min-height: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; position: relative; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
7
4
  & .crisp-authshell-progress { position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: var(--crisp-border-default); }
8
5
  & .crisp-authshell-progress-fill { height: 2px; background: var(--crisp-fg-primary); border-radius: 4px; transition: width .2s; }
9
-
10
6
  & .crisp-authshell-logo { margin-top: var(--crisp-space-8); height: 24px; display: flex; align-items: center; }
11
-
12
7
  & .crisp-authshell-card { margin-top: var(--crisp-space-6); display: flex; height: 692px; border-radius: 20px; border: 1px solid var(--crisp-border-subtle); overflow: hidden; }
13
-
14
8
  & .crisp-authshell-pane { flex: 0 0 564px; padding: 72px; display: flex; flex-direction: column; box-sizing: border-box; }
15
-
16
9
  & .crisp-authshell-preview { flex: 0 0 564px; padding: 96px 64px; background: var(--crisp-bg-subtle); border-inline-start: 1px solid color-mix(in srgb, var(--crisp-fg-primary) 5%, transparent); position: relative; overflow: hidden; box-sizing: border-box; }
17
10
  & .crisp-authshell-preview::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 120px; background: linear-gradient(color-mix(in srgb, var(--crisp-bg-subtle) 0%, transparent) 0%, var(--crisp-bg-subtle) 100%); pointer-events: none; }
18
-
19
11
  & .crisp-authshell-body { width: 420px; margin: 0 auto; display: flex; flex-direction: column; gap: var(--crisp-space-8); align-items: center; }
20
-
21
12
  & .crisp-authshell-title { font-size: 20px; line-height: 24px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.4px; color: var(--crisp-fg-primary); align-self: stretch; }
22
-
23
13
  & .crisp-authshell-form { align-self: stretch; display: flex; flex-direction: column; gap: 28px; }
24
-
25
14
  & .crisp-authshell-footer { margin-top: var(--crisp-space-6); display: flex; align-items: center; gap: var(--crisp-space-1); font-size: var(--crisp-text-sm); line-height: 16px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
26
15
  & .crisp-authshell-footer a { color: inherit; font-weight: var(--crisp-weight-medium); text-decoration: underline; }
27
-
28
- /* Auth-surface control treatment: flatter than the in-app chrome — a plain
29
- hairline ring instead of elevation.field's soft glow, and a 36px (not
16
+ /* Auth-surface control treatment: flatter than the in-app chrome — a plain hairline ring instead of elevation.field's soft glow, and a 36px (not
30
17
  40px) submit. Scoped to .crisp-authshell-body so a consumer keeps using
31
18
  crisp's Input / FormField / Button and gets the auth treatment for free. */
32
19
  & .crisp-authshell-body .crisp-formfield-label { font-size: var(--crisp-text-sm); line-height: 16px; font-weight: var(--crisp-weight-medium); letter-spacing: -0.12px; color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent); padding-inline-start: var(--crisp-space-1); }
@@ -34,8 +21,7 @@
34
21
  & .crisp-authshell-body .crisp-input { height: 34px; padding-inline: var(--crisp-space-2-5); border-radius: 10px; background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; transition: box-shadow .14s, background-color .14s; }
35
22
  & .crisp-authshell-body .crisp-input:focus { box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); }
36
23
  /* Same three-layer brand shadow as Button's primary intent, but the auth
37
- button's inset ring is measured at rgba(0,0,0,0.06) — a hairline, not
38
- the in-app button's rgba(255,255,255,0.07) highlight. */
24
+ button's inset ring is measured at rgba(0,0,0,0.06) — a hairline, not the in-app button's rgba(255,255,255,0.07) highlight. */
39
25
  & .crisp-authshell-body .crisp-button { height: 36px; padding-inline: var(--crisp-space-3); border-radius: 10px; }
40
26
  & .crisp-authshell-body .crisp-button--intent_primary { box-shadow: inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); }
41
27
 
@@ -44,8 +30,7 @@
44
30
  that bracket, not a measured value. A CONTAINER query, not a media
45
31
  query: the shell is embedded in the docs inside an ~800px column, where
46
32
  a viewport query would keep the 1130px card and overflow it. Asking the
47
- shell's own width is what "there isn't room for the preview" means. */
48
- container-type: inline-size;
33
+ shell's own width is what "there isn't room for the preview" means. */ container-type: inline-size;
49
34
  @container (max-width: 1200px) { & .crisp-authshell-preview { display: none; } }
50
35
  }
51
36
 
package/dist/avatar.css CHANGED
@@ -1,5 +1,6 @@
1
1
  .crisp-avatar {
2
- display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-semibold); overflow: hidden; user-select: none; & img { width: 100%; height: 100%; object-fit: cover; }
2
+ display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-semibold); overflow: hidden; user-select: none;
3
+ & img { width: 100%; height: 100%; object-fit: cover; }
3
4
  }
4
5
  .crisp-avatar--size_sm {
5
6
  height: 16px; width: 16px; font-size: 9px;
@@ -1,6 +1,7 @@
1
1
  @layer crisp-components {
2
2
  .crisp-avatar {
3
- display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-semibold); overflow: hidden; user-select: none; & img { width: 100%; height: 100%; object-fit: cover; }
3
+ display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-semibold); overflow: hidden; user-select: none;
4
+ & img { width: 100%; height: 100%; object-fit: cover; }
4
5
  }
5
6
  .crisp-avatar--size_sm {
6
7
  height: 16px; width: 16px; font-size: 9px;
package/dist/board.css CHANGED
@@ -17,10 +17,7 @@
17
17
  & .crisp-board-card:focus { outline: none; }
18
18
  & .crisp-board-card:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
19
19
  /* announced, never drawn */
20
- & .crisp-board-live {
21
- position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
22
- overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
23
- }
20
+ & .crisp-board-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
24
21
  }
25
22
 
26
23
  @media (prefers-reduced-motion: reduce) {
@@ -18,10 +18,7 @@
18
18
  & .crisp-board-card:focus { outline: none; }
19
19
  & .crisp-board-card:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
20
20
  /* announced, never drawn */
21
- & .crisp-board-live {
22
- position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
23
- overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
24
- }
21
+ & .crisp-board-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
25
22
  }
26
23
 
27
24
  @media (prefers-reduced-motion: reduce) {
@@ -7,5 +7,4 @@
7
7
  & .crisp-breadcrumb-item[aria-current] { color: var(--crisp-fg-primary); font-weight: var(--crisp-weight-medium); }
8
8
  & .crisp-breadcrumb-sep { flex-shrink: 0; color: color-mix(in srgb, var(--crisp-fg-primary) 28%, transparent); }
9
9
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
10
-
11
10
  }
@@ -8,6 +8,5 @@
8
8
  & .crisp-breadcrumb-item[aria-current] { color: var(--crisp-fg-primary); font-weight: var(--crisp-weight-medium); }
9
9
  & .crisp-breadcrumb-sep { flex-shrink: 0; color: color-mix(in srgb, var(--crisp-fg-primary) 28%, transparent); }
10
10
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
11
-
12
11
  }
13
12
  }
package/dist/button.css CHANGED
@@ -1,17 +1,24 @@
1
1
  .crisp-button {
2
- display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1-5); font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; line-height: 20px; white-space: nowrap; border: none; cursor: pointer; transition: background-color .2s, box-shadow .2s, color .2s; &:disabled { opacity: 0.5; cursor: not-allowed; }
2
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1-5); font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; line-height: 20px; white-space: nowrap; border: none; cursor: pointer; transition: background-color .2s, box-shadow .2s, color .2s;
3
+ &:disabled { opacity: 0.5; cursor: not-allowed; }
3
4
  }
4
5
  .crisp-button--intent_primary {
5
- background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); &:hover { background: var(--crisp-bg-brand-solid-pressed); } &:active { background: var(--crisp-bg-brand-solid-pressed); }
6
+ background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08);
7
+ &:hover { background: var(--crisp-bg-brand-solid-pressed); }
8
+ &:active { background: var(--crisp-bg-brand-solid-pressed); }
6
9
  }
7
10
  .crisp-button--intent_neutral {
8
- background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); &:hover { background: var(--crisp-bg-raised); }
11
+ background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04);
12
+ &:hover { background: var(--crisp-bg-raised); }
9
13
  }
10
14
  .crisp-button--intent_danger {
11
- background: var(--crisp-bg-danger-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(186,37,37,0.20), 0 3px 6px -2px rgba(186,37,37,0.12); &:hover { filter: brightness(0.96); } &:active { filter: brightness(0.92); }
15
+ background: var(--crisp-bg-danger-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(186,37,37,0.20), 0 3px 6px -2px rgba(186,37,37,0.12);
16
+ &:hover { filter: brightness(0.96); }
17
+ &:active { filter: brightness(0.92); }
12
18
  }
13
19
  .crisp-button--intent_ghost {
14
- background: transparent; color: var(--crisp-fg-muted); box-shadow: none; &:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
20
+ background: transparent; color: var(--crisp-fg-muted); box-shadow: none;
21
+ &:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
15
22
  }
16
23
  .crisp-button--size_sm {
17
24
  height: 24px; padding-inline: var(--crisp-space-1-5); font-size: var(--crisp-text-md); border-radius: var(--crisp-radius-md);
@@ -29,7 +36,8 @@
29
36
  padding-inline: 0; aspect-ratio: 1 / 1;
30
37
  }
31
38
  .crisp-button--touchTarget_true {
32
- position: relative; &::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; min-width: 44px; min-height: 44px; }
39
+ position: relative;
40
+ &::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; min-width: 44px; min-height: 44px; }
33
41
  }
34
42
  .crisp-button--touchTarget_false {
35
43
 
@@ -1,18 +1,25 @@
1
1
  @layer crisp-components {
2
2
  .crisp-button {
3
- display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1-5); font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; line-height: 20px; white-space: nowrap; border: none; cursor: pointer; transition: background-color .2s, box-shadow .2s, color .2s; &:disabled { opacity: 0.5; cursor: not-allowed; }
3
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1-5); font-family: var(--crisp-font-sans); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; line-height: 20px; white-space: nowrap; border: none; cursor: pointer; transition: background-color .2s, box-shadow .2s, color .2s;
4
+ &:disabled { opacity: 0.5; cursor: not-allowed; }
4
5
  }
5
6
  .crisp-button--intent_primary {
6
- background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); &:hover { background: var(--crisp-bg-brand-solid-pressed); } &:active { background: var(--crisp-bg-brand-solid-pressed); }
7
+ background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08);
8
+ &:hover { background: var(--crisp-bg-brand-solid-pressed); }
9
+ &:active { background: var(--crisp-bg-brand-solid-pressed); }
7
10
  }
8
11
  .crisp-button--intent_neutral {
9
- background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); &:hover { background: var(--crisp-bg-raised); }
12
+ background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04);
13
+ &:hover { background: var(--crisp-bg-raised); }
10
14
  }
11
15
  .crisp-button--intent_danger {
12
- background: var(--crisp-bg-danger-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(186,37,37,0.20), 0 3px 6px -2px rgba(186,37,37,0.12); &:hover { filter: brightness(0.96); } &:active { filter: brightness(0.92); }
16
+ background: var(--crisp-bg-danger-solid); color: var(--crisp-fg-on-brand); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.07), 0 2px 4px -2px rgba(186,37,37,0.20), 0 3px 6px -2px rgba(186,37,37,0.12);
17
+ &:hover { filter: brightness(0.96); }
18
+ &:active { filter: brightness(0.92); }
13
19
  }
14
20
  .crisp-button--intent_ghost {
15
- background: transparent; color: var(--crisp-fg-muted); box-shadow: none; &:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
21
+ background: transparent; color: var(--crisp-fg-muted); box-shadow: none;
22
+ &:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
16
23
  }
17
24
  .crisp-button--size_sm {
18
25
  height: 24px; padding-inline: var(--crisp-space-1-5); font-size: var(--crisp-text-md); border-radius: var(--crisp-radius-md);
@@ -30,7 +37,8 @@
30
37
  padding-inline: 0; aspect-ratio: 1 / 1;
31
38
  }
32
39
  .crisp-button--touchTarget_true {
33
- position: relative; &::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; min-width: 44px; min-height: 44px; }
40
+ position: relative;
41
+ &::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; min-width: 44px; min-height: 44px; }
34
42
  }
35
43
  .crisp-button--touchTarget_false {
36
44
 
package/dist/card.css CHANGED
@@ -13,7 +13,8 @@
13
13
 
14
14
  }
15
15
  .crisp-card--interactive_true {
16
- cursor: pointer; transition: box-shadow 0.12s ease; &:hover { box-shadow: inset 0 0 0 1px var(--crisp-border-default), 0 1px 2px rgba(0,0,0,0.04), 0 6px 16px -6px rgba(28,40,64,0.12); }
16
+ cursor: pointer; transition: box-shadow 0.12s ease;
17
+ &:hover { box-shadow: inset 0 0 0 1px var(--crisp-border-default), 0 1px 2px rgba(0,0,0,0.04), 0 6px 16px -6px rgba(28,40,64,0.12); }
17
18
  }
18
19
  .crisp-card--interactive_false {
19
20
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  }
16
16
  .crisp-card--interactive_true {
17
- cursor: pointer; transition: box-shadow 0.12s ease; &:hover { box-shadow: inset 0 0 0 1px var(--crisp-border-default), 0 1px 2px rgba(0,0,0,0.04), 0 6px 16px -6px rgba(28,40,64,0.12); }
17
+ cursor: pointer; transition: box-shadow 0.12s ease;
18
+ &:hover { box-shadow: inset 0 0 0 1px var(--crisp-border-default), 0 1px 2px rgba(0,0,0,0.04), 0 6px 16px -6px rgba(28,40,64,0.12); }
18
19
  }
19
20
  .crisp-card--interactive_false {
20
21
 
package/dist/checkbox.css CHANGED
@@ -1,13 +1,10 @@
1
1
  .crisp-checkbox {
2
- appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: var(--crisp-radius-sm)
3
- ; background: var(--crisp-bg-surface)
4
- ; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary)
5
- 9%, transparent); cursor: pointer; transition: background-color .12s, box-shadow .12s; &:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 30%, transparent); }
6
- &:checked, &:indeterminate { background: var(--crisp-bg-brand-solid) center / 10px no-repeat; box-shadow: none; }
7
- &:checked { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
8
- &:indeterminate { background-image: linear-gradient(var(--crisp-fg-on-brand), var(--crisp-fg-on-brand)); background-size: 8px 2px; }
9
- &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
10
-
2
+ appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: var(--crisp-radius-sm) ; background: var(--crisp-bg-surface) ; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; transition: background-color .12s, box-shadow .12s;
3
+ &:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 30%, transparent); }
4
+ &:checked, &:indeterminate { background: var(--crisp-bg-brand-solid) center / 10px no-repeat; box-shadow: none; }
5
+ &:checked { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
6
+ &:indeterminate { background-image: linear-gradient(var(--crisp-fg-on-brand), var(--crisp-fg-on-brand)); background-size: 8px 2px; }
7
+ &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
11
8
  }
12
9
 
13
10
  @media (prefers-reduced-motion: reduce) {
@@ -1,14 +1,11 @@
1
1
  @layer crisp-components {
2
2
  .crisp-checkbox {
3
- appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: var(--crisp-radius-sm)
4
- ; background: var(--crisp-bg-surface)
5
- ; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary)
6
- 9%, transparent); cursor: pointer; transition: background-color .12s, box-shadow .12s; &:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 30%, transparent); }
7
- &:checked, &:indeterminate { background: var(--crisp-bg-brand-solid) center / 10px no-repeat; box-shadow: none; }
8
- &:checked { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
9
- &:indeterminate { background-image: linear-gradient(var(--crisp-fg-on-brand), var(--crisp-fg-on-brand)); background-size: 8px 2px; }
10
- &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
11
-
3
+ appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: var(--crisp-radius-sm) ; background: var(--crisp-bg-surface) ; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; transition: background-color .12s, box-shadow .12s;
4
+ &:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 30%, transparent); }
5
+ &:checked, &:indeterminate { background: var(--crisp-bg-brand-solid) center / 10px no-repeat; box-shadow: none; }
6
+ &:checked { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
7
+ &:indeterminate { background-image: linear-gradient(var(--crisp-fg-on-brand), var(--crisp-fg-on-brand)); background-size: 8px 2px; }
8
+ &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 1px; }
12
9
  }
13
10
 
14
11
  @media (prefers-reduced-motion: reduce) {
@@ -1,35 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.avatarRecipe = void 0;
3
+ exports.spec = exports.avatarRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- const config = (0, core_1.defineRecipe)({
6
+ const spec = (0, core_1.defineSpec)({
7
7
  name: "avatar",
8
- base: `display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; font-family: ${tokens_1.contract.font.sans}; font-weight: ${tokens_1.contract.weight.semibold}; overflow: hidden; user-select: none; & img { width: 100%; height: 100%; object-fit: cover; }`,
8
+ base: {
9
+ display: "inline-flex",
10
+ alignItems: "center",
11
+ justifyContent: "center",
12
+ flexShrink: 0,
13
+ fontFamily: tokens_1.contract.font.sans,
14
+ fontWeight: tokens_1.contract.weight.semibold,
15
+ overflow: "hidden",
16
+ userSelect: "none",
17
+ },
18
+ parts: [
19
+ {
20
+ slot: "image",
21
+ selector: "& img",
22
+ decls: { width: "100%", height: "100%", objectFit: "cover" },
23
+ },
24
+ ],
9
25
  variants: {
10
26
  size: {
11
- sm: `height: 16px; width: 16px; font-size: 9px;`,
12
- md: `height: 20px; width: 20px; font-size: 10px;`,
13
- lg: `height: 24px; width: 24px; font-size: ${tokens_1.contract.text.sm};`,
14
- xl: `height: 32px; width: 32px; font-size: ${tokens_1.contract.text.lg};`,
27
+ sm: { height: "16px", width: "16px", fontSize: "9px" },
28
+ md: { height: "20px", width: "20px", fontSize: "10px" },
29
+ lg: { height: "24px", width: "24px", fontSize: tokens_1.contract.text.sm },
30
+ xl: { height: "32px", width: "32px", fontSize: tokens_1.contract.text.lg },
15
31
  },
16
32
  shape: {
17
- circle: `border-radius: ${tokens_1.contract.radius.full};`,
18
- rounded: `border-radius: 30%;`,
33
+ circle: { borderRadius: tokens_1.contract.radius.full },
34
+ rounded: { borderRadius: "30%" },
19
35
  },
20
36
  tone: {
21
- neutral: `background: ${tokens_1.contract.bgRaised}; color: ${tokens_1.contract.fgMuted}; box-shadow: inset 0 0 0 1px ${tokens_1.contract.borderDefault};`,
22
- brand: `background: ${tokens_1.contract.bgBrandSolid}; color: #fff;`,
23
- orange: `background: ${tokens_1.contract.bgOrange}; color: #fff;`,
24
- cyan: `background: ${tokens_1.contract.bgCyan}; color: #fff;`,
25
- purple: `background: ${tokens_1.contract.bgPurple}; color: #fff;`,
26
- green: `background: ${tokens_1.contract.bgSuccess}; color: #fff;`,
37
+ neutral: {
38
+ background: tokens_1.contract.bgRaised,
39
+ color: tokens_1.contract.fgMuted,
40
+ boxShadow: `inset 0 0 0 1px ${tokens_1.contract.borderDefault}`,
41
+ },
42
+ brand: { background: tokens_1.contract.bgBrandSolid, color: "#fff" },
43
+ orange: { background: tokens_1.contract.bgOrange, color: "#fff" },
44
+ cyan: { background: tokens_1.contract.bgCyan, color: "#fff" },
45
+ purple: { background: tokens_1.contract.bgPurple, color: "#fff" },
46
+ green: { background: tokens_1.contract.bgSuccess, color: "#fff" },
27
47
  },
28
48
  },
29
49
  defaultVariants: { size: "md", shape: "circle", tone: "neutral" },
30
- compoundVariants: [],
31
- });
32
- exports.avatarRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
33
- config,
34
50
  });
51
+ exports.spec = spec;
52
+ const config = (0, core_1.specToRecipe)(spec);
53
+ exports.avatarRecipe = Object.assign((0, core_1.resolveRecipe)(config), { config });
35
54
  exports.default = config;