@techfides/ui-library-design 0.1.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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/assets/brands/digital-boost-group.svg +1 -0
  4. package/assets/brands/rtsg.svg +1 -0
  5. package/assets/brands/tech-it-out.svg +1 -0
  6. package/assets/brands/techfides.svg +1 -0
  7. package/css/index.css +8 -0
  8. package/css/theme.css +1640 -0
  9. package/dist/brands.d.ts +39 -0
  10. package/dist/brands.js +41 -0
  11. package/dist/brands.js.map +1 -0
  12. package/dist/charts/animation.js +14 -0
  13. package/dist/charts/animation.js.map +1 -0
  14. package/dist/charts/bars.d.ts +22 -0
  15. package/dist/charts/bars.js +61 -0
  16. package/dist/charts/bars.js.map +1 -0
  17. package/dist/charts/groupedBars.d.ts +20 -0
  18. package/dist/charts/groupedBars.js +82 -0
  19. package/dist/charts/groupedBars.js.map +1 -0
  20. package/dist/charts/paint.js +19 -0
  21. package/dist/charts/paint.js.map +1 -0
  22. package/dist/charts/spark.d.ts +17 -0
  23. package/dist/charts/spark.js +159 -0
  24. package/dist/charts/spark.js.map +1 -0
  25. package/dist/charts/tooltip.js +41 -0
  26. package/dist/charts/tooltip.js.map +1 -0
  27. package/dist/cn.d.ts +6 -0
  28. package/dist/cn.js +178 -0
  29. package/dist/cn.js.map +1 -0
  30. package/dist/control.d.ts +15 -0
  31. package/dist/control.js +13 -0
  32. package/dist/control.js.map +1 -0
  33. package/dist/index.d.ts +65 -0
  34. package/dist/index.js +65 -0
  35. package/dist/mark.d.ts +7 -0
  36. package/dist/mark.js +11 -0
  37. package/dist/mark.js.map +1 -0
  38. package/dist/parts/control.js +55 -0
  39. package/dist/parts/control.js.map +1 -0
  40. package/dist/parts/eyebrow.js +8 -0
  41. package/dist/parts/eyebrow.js.map +1 -0
  42. package/dist/parts/mark.js +52 -0
  43. package/dist/parts/mark.js.map +1 -0
  44. package/dist/parts/reveal.js +35 -0
  45. package/dist/parts/reveal.js.map +1 -0
  46. package/dist/parts/rouse.js +25 -0
  47. package/dist/parts/rouse.js.map +1 -0
  48. package/dist/parts/rule.js +12 -0
  49. package/dist/parts/rule.js.map +1 -0
  50. package/dist/parts/scroll.js +10 -0
  51. package/dist/parts/scroll.js.map +1 -0
  52. package/dist/parts/shell.js +23 -0
  53. package/dist/parts/shell.js.map +1 -0
  54. package/dist/parts/surface.js +15 -0
  55. package/dist/parts/surface.js.map +1 -0
  56. package/dist/parts/tone.js +13 -0
  57. package/dist/parts/tone.js.map +1 -0
  58. package/dist/parts/travel.js +11 -0
  59. package/dist/parts/travel.js.map +1 -0
  60. package/dist/recipes/accordion.d.ts +13 -0
  61. package/dist/recipes/accordion.js +42 -0
  62. package/dist/recipes/accordion.js.map +1 -0
  63. package/dist/recipes/alert.d.ts +16 -0
  64. package/dist/recipes/alert.js +21 -0
  65. package/dist/recipes/alert.js.map +1 -0
  66. package/dist/recipes/band.d.ts +8 -0
  67. package/dist/recipes/band.js +22 -0
  68. package/dist/recipes/band.js.map +1 -0
  69. package/dist/recipes/bars.d.ts +17 -0
  70. package/dist/recipes/bars.js +27 -0
  71. package/dist/recipes/bars.js.map +1 -0
  72. package/dist/recipes/brandMark.d.ts +5 -0
  73. package/dist/recipes/brandMark.js +7 -0
  74. package/dist/recipes/brandMark.js.map +1 -0
  75. package/dist/recipes/button.d.ts +23 -0
  76. package/dist/recipes/button.js +229 -0
  77. package/dist/recipes/button.js.map +1 -0
  78. package/dist/recipes/cardHeader.d.ts +10 -0
  79. package/dist/recipes/cardHeader.js +11 -0
  80. package/dist/recipes/cardHeader.js.map +1 -0
  81. package/dist/recipes/checkbox.d.ts +26 -0
  82. package/dist/recipes/checkbox.js +103 -0
  83. package/dist/recipes/checkbox.js.map +1 -0
  84. package/dist/recipes/chip.d.ts +26 -0
  85. package/dist/recipes/chip.js +123 -0
  86. package/dist/recipes/chip.js.map +1 -0
  87. package/dist/recipes/codeEditor.d.ts +74 -0
  88. package/dist/recipes/codeEditor.js +71 -0
  89. package/dist/recipes/codeEditor.js.map +1 -0
  90. package/dist/recipes/datePicker.d.ts +39 -0
  91. package/dist/recipes/datePicker.js +166 -0
  92. package/dist/recipes/datePicker.js.map +1 -0
  93. package/dist/recipes/dialog.d.ts +37 -0
  94. package/dist/recipes/dialog.js +116 -0
  95. package/dist/recipes/dialog.js.map +1 -0
  96. package/dist/recipes/feature.d.ts +15 -0
  97. package/dist/recipes/feature.js +48 -0
  98. package/dist/recipes/feature.js.map +1 -0
  99. package/dist/recipes/field.d.ts +26 -0
  100. package/dist/recipes/field.js +129 -0
  101. package/dist/recipes/field.js.map +1 -0
  102. package/dist/recipes/findings.d.ts +11 -0
  103. package/dist/recipes/findings.js +16 -0
  104. package/dist/recipes/findings.js.map +1 -0
  105. package/dist/recipes/heading.d.ts +17 -0
  106. package/dist/recipes/heading.js +37 -0
  107. package/dist/recipes/heading.js.map +1 -0
  108. package/dist/recipes/heartbeat.d.ts +23 -0
  109. package/dist/recipes/heartbeat.js +43 -0
  110. package/dist/recipes/heartbeat.js.map +1 -0
  111. package/dist/recipes/input.d.ts +17 -0
  112. package/dist/recipes/input.js +90 -0
  113. package/dist/recipes/input.js.map +1 -0
  114. package/dist/recipes/listItem.d.ts +6 -0
  115. package/dist/recipes/listItem.js +8 -0
  116. package/dist/recipes/listItem.js.map +1 -0
  117. package/dist/recipes/listbox.d.ts +12 -0
  118. package/dist/recipes/listbox.js +29 -0
  119. package/dist/recipes/listbox.js.map +1 -0
  120. package/dist/recipes/marquee.d.ts +19 -0
  121. package/dist/recipes/marquee.js +36 -0
  122. package/dist/recipes/marquee.js.map +1 -0
  123. package/dist/recipes/menu.d.ts +26 -0
  124. package/dist/recipes/menu.js +86 -0
  125. package/dist/recipes/menu.js.map +1 -0
  126. package/dist/recipes/metaRow.d.ts +14 -0
  127. package/dist/recipes/metaRow.js +19 -0
  128. package/dist/recipes/metaRow.js.map +1 -0
  129. package/dist/recipes/meter.d.ts +23 -0
  130. package/dist/recipes/meter.js +39 -0
  131. package/dist/recipes/meter.js.map +1 -0
  132. package/dist/recipes/motion.d.ts +6 -0
  133. package/dist/recipes/motion.js +34 -0
  134. package/dist/recipes/motion.js.map +1 -0
  135. package/dist/recipes/nebula.d.ts +9 -0
  136. package/dist/recipes/nebula.js +15 -0
  137. package/dist/recipes/nebula.js.map +1 -0
  138. package/dist/recipes/numberRange.d.ts +15 -0
  139. package/dist/recipes/numberRange.js +109 -0
  140. package/dist/recipes/numberRange.js.map +1 -0
  141. package/dist/recipes/paper.d.ts +22 -0
  142. package/dist/recipes/paper.js +42 -0
  143. package/dist/recipes/paper.js.map +1 -0
  144. package/dist/recipes/progressBar.d.ts +7 -0
  145. package/dist/recipes/progressBar.js +11 -0
  146. package/dist/recipes/progressBar.js.map +1 -0
  147. package/dist/recipes/queue.d.ts +16 -0
  148. package/dist/recipes/queue.js +27 -0
  149. package/dist/recipes/queue.js.map +1 -0
  150. package/dist/recipes/radioGroup.d.ts +27 -0
  151. package/dist/recipes/radioGroup.js +68 -0
  152. package/dist/recipes/radioGroup.js.map +1 -0
  153. package/dist/recipes/scopeSwitcher.d.ts +26 -0
  154. package/dist/recipes/scopeSwitcher.js +80 -0
  155. package/dist/recipes/scopeSwitcher.js.map +1 -0
  156. package/dist/recipes/scrollArea.d.ts +19 -0
  157. package/dist/recipes/scrollArea.js +43 -0
  158. package/dist/recipes/scrollArea.js.map +1 -0
  159. package/dist/recipes/searchPalette.d.ts +19 -0
  160. package/dist/recipes/searchPalette.js +63 -0
  161. package/dist/recipes/searchPalette.js.map +1 -0
  162. package/dist/recipes/sectionHeader.d.ts +9 -0
  163. package/dist/recipes/sectionHeader.js +10 -0
  164. package/dist/recipes/sectionHeader.js.map +1 -0
  165. package/dist/recipes/segmentedControl.d.ts +9 -0
  166. package/dist/recipes/segmentedControl.js +29 -0
  167. package/dist/recipes/segmentedControl.js.map +1 -0
  168. package/dist/recipes/select.d.ts +9 -0
  169. package/dist/recipes/select.js +21 -0
  170. package/dist/recipes/select.js.map +1 -0
  171. package/dist/recipes/separator.d.ts +14 -0
  172. package/dist/recipes/separator.js +59 -0
  173. package/dist/recipes/separator.js.map +1 -0
  174. package/dist/recipes/sidebar.d.ts +40 -0
  175. package/dist/recipes/sidebar.js +128 -0
  176. package/dist/recipes/sidebar.js.map +1 -0
  177. package/dist/recipes/sky.d.ts +20 -0
  178. package/dist/recipes/sky.js +127 -0
  179. package/dist/recipes/sky.js.map +1 -0
  180. package/dist/recipes/slider.d.ts +20 -0
  181. package/dist/recipes/slider.js +62 -0
  182. package/dist/recipes/slider.js.map +1 -0
  183. package/dist/recipes/stat.d.ts +30 -0
  184. package/dist/recipes/stat.js +52 -0
  185. package/dist/recipes/stat.js.map +1 -0
  186. package/dist/recipes/switch.d.ts +20 -0
  187. package/dist/recipes/switch.js +60 -0
  188. package/dist/recipes/switch.js.map +1 -0
  189. package/dist/recipes/table.d.ts +74 -0
  190. package/dist/recipes/table.js +182 -0
  191. package/dist/recipes/table.js.map +1 -0
  192. package/dist/recipes/tableFilter.d.ts +14 -0
  193. package/dist/recipes/tableFilter.js +28 -0
  194. package/dist/recipes/tableFilter.js.map +1 -0
  195. package/dist/recipes/tablePaging.d.ts +15 -0
  196. package/dist/recipes/tablePaging.js +50 -0
  197. package/dist/recipes/tablePaging.js.map +1 -0
  198. package/dist/recipes/tail.d.ts +20 -0
  199. package/dist/recipes/tail.js +48 -0
  200. package/dist/recipes/tail.js.map +1 -0
  201. package/dist/recipes/text.d.ts +25 -0
  202. package/dist/recipes/text.js +94 -0
  203. package/dist/recipes/text.js.map +1 -0
  204. package/dist/recipes/textarea.d.ts +13 -0
  205. package/dist/recipes/textarea.js +48 -0
  206. package/dist/recipes/textarea.js.map +1 -0
  207. package/dist/recipes/tile.d.ts +18 -0
  208. package/dist/recipes/tile.js +85 -0
  209. package/dist/recipes/tile.js.map +1 -0
  210. package/dist/recipes/tooltip.d.ts +12 -0
  211. package/dist/recipes/tooltip.js +26 -0
  212. package/dist/recipes/tooltip.js.map +1 -0
  213. package/dist/recipes/topBar.d.ts +15 -0
  214. package/dist/recipes/topBar.js +35 -0
  215. package/dist/recipes/topBar.js.map +1 -0
  216. package/dist/recipes/trail.d.ts +27 -0
  217. package/dist/recipes/trail.js +66 -0
  218. package/dist/recipes/trail.js.map +1 -0
  219. package/dist/recipes/userMenu.d.ts +11 -0
  220. package/dist/recipes/userMenu.js +38 -0
  221. package/dist/recipes/userMenu.js.map +1 -0
  222. package/dist/tally.d.ts +17 -0
  223. package/dist/tally.js +75 -0
  224. package/dist/tally.js.map +1 -0
  225. package/dist/tone.d.ts +26 -0
  226. package/dist/tone.js +26 -0
  227. package/dist/tone.js.map +1 -0
  228. package/dist/words.d.ts +116 -0
  229. package/dist/words.js +93 -0
  230. package/dist/words.js.map +1 -0
  231. package/package.json +72 -0
@@ -0,0 +1,229 @@
1
+ import { toneBlend } from "../tone.js";
2
+ import { controlBase, controlBox, controlGap, controlInert, controlReach, controlSizes, hitArea } from "../parts/control.js";
3
+ import { defaultTone, tones } from "../parts/tone.js";
4
+ import { cva } from "class-variance-authority";
5
+ //#region src/recipes/button.ts
6
+ const HIT_AREA = hitArea("after:h-tf-target");
7
+ const QUIET_HIT = hitArea("after:h-tf-target", "after:w-tf-target");
8
+ const buttonFace = [
9
+ "isolate",
10
+ "justify-center",
11
+ "whitespace-nowrap",
12
+ "tracking-tf-tight",
13
+ "tf-cloud-md"
14
+ ];
15
+ const buttonSpinnerRecipe = cva(["absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", "tf-arrives motion-reduce:transition-none"]);
16
+ const buttonWordsRecipe = cva([
17
+ "inline-flex items-center justify-center tf-text-trim",
18
+ "tf-crossfades motion-reduce:transition-none",
19
+ "in-data-loading:opacity-0"
20
+ ], {
21
+ defaultVariants: { size: "md" },
22
+ variants: { size: controlGap }
23
+ });
24
+ const buttonTempo = ["tf-blend-drift", "tf-weather-trail"];
25
+ const buttonGeometry = {
26
+ lg: `${controlBox.lg} rounded-tf-card px-8 font-medium`,
27
+ md: `${controlBox.md} rounded-tf-block px-6`,
28
+ sm: `${controlBox.sm} px-4 ${HIT_AREA}`,
29
+ xs: `${controlBox.xs} px-2 ${QUIET_HIT}`
30
+ };
31
+ const CLOUD = [
32
+ "tf-cloud-brand",
33
+ "tf-clouded",
34
+ "interactive:hovered:tf-clouding"
35
+ ].join(" ");
36
+ const CLOUD_INK = [
37
+ "tf-cloud-ink",
38
+ "tf-clouded",
39
+ "interactive:hovered:tf-clouding"
40
+ ].join(" ");
41
+ const CLOUD_ON_REACH = [
42
+ "tf-cloud-ink",
43
+ "tf-cloud-hidden",
44
+ "interactive:hovered:tf-clouding",
45
+ "interactive:hovered:tf-plated"
46
+ ].join(" ");
47
+ const BLEND = [
48
+ "bg-tf-blend",
49
+ CLOUD,
50
+ "tf-edge-sweep tf-edge-milk tf-swept-top",
51
+ "tf-glow tf-lit-rest tf-settled",
52
+ "interactive:hovered:tf-blended",
53
+ "interactive:hovered:tf-milked",
54
+ "interactive:hovered:tf-lit-inside",
55
+ "interactive:hovered:tf-lifted",
56
+ "interactive:pressed:tf-pressed",
57
+ "motion-safe:interactive:pressed:tf-tilted"
58
+ ].join(" ");
59
+ const INK = [
60
+ "tf-ink-glide",
61
+ "data-loading:bg-none",
62
+ "[&_svg]:tf-transition [&_svg]:text-tf-muted"
63
+ ].join(" ");
64
+ const MARK_ON_REACH = {
65
+ accent: "interactive:hovered:[&_svg]:text-tf-accent-hi",
66
+ danger: "interactive:hovered:[&_svg]:text-tf-danger-hi",
67
+ info: "interactive:hovered:[&_svg]:text-tf-info-hi",
68
+ success: "interactive:hovered:[&_svg]:text-tf-success-hi",
69
+ warning: "interactive:hovered:[&_svg]:text-tf-warning-hi"
70
+ };
71
+ const WORDS_ON_REACH = {
72
+ accent: "interactive:hovered:text-tf-accent-hi",
73
+ danger: "interactive:hovered:text-tf-danger-hi",
74
+ info: "interactive:hovered:text-tf-info-hi",
75
+ success: "interactive:hovered:text-tf-success-hi",
76
+ warning: "interactive:hovered:text-tf-warning-hi"
77
+ };
78
+ const FLAT_INK = "text-tf-muted interactive:hovered:text-tf-fg";
79
+ const buttonPress = ["motion-safe:interactive:pressed:translate-y-px", "motion-reduce:interactive:pressed:brightness-95"];
80
+ const buttonRecipe = cva([
81
+ ...controlBase,
82
+ ...buttonFace,
83
+ ...buttonTempo,
84
+ ...controlReach,
85
+ ...buttonPress,
86
+ ...controlInert,
87
+ "data-loading:opacity-100"
88
+ ], {
89
+ compoundVariants: [
90
+ {
91
+ class: "tf-cloud-tight",
92
+ variant: "ghost"
93
+ },
94
+ ...tones.map((accent) => ({
95
+ accent,
96
+ class: `${toneBlend[accent]} ${WORDS_ON_REACH[accent]} ${MARK_ON_REACH[accent]}`,
97
+ variant: "ghost"
98
+ })),
99
+ {
100
+ class: FLAT_INK,
101
+ iconOnly: true,
102
+ variant: "ghost"
103
+ },
104
+ {
105
+ class: FLAT_INK,
106
+ iconOnly: true,
107
+ variant: "secondary"
108
+ },
109
+ {
110
+ class: "px-0",
111
+ iconOnly: true
112
+ },
113
+ {
114
+ class: "tf-icons-solo [&_svg]:size-tf-icon-solo-xs",
115
+ iconOnly: true,
116
+ size: "xs"
117
+ },
118
+ {
119
+ class: "tf-icons-solo [&_svg]:size-tf-icon-solo-sm",
120
+ iconOnly: true,
121
+ size: "sm"
122
+ },
123
+ {
124
+ class: "tf-icons-solo [&_svg]:size-tf-icon-solo-md",
125
+ iconOnly: true,
126
+ size: "md"
127
+ },
128
+ {
129
+ class: "tf-icons-solo [&_svg]:size-tf-icon-solo-lg",
130
+ iconOnly: true,
131
+ size: "lg"
132
+ },
133
+ {
134
+ class: "pr-7",
135
+ size: "lg",
136
+ trailing: true
137
+ },
138
+ {
139
+ class: "pr-5",
140
+ size: "md",
141
+ trailing: true
142
+ },
143
+ {
144
+ class: "pr-3",
145
+ size: "sm",
146
+ trailing: true
147
+ },
148
+ {
149
+ class: "pl-7",
150
+ leading: true,
151
+ size: "lg"
152
+ },
153
+ {
154
+ class: "pl-5",
155
+ leading: true,
156
+ size: "md"
157
+ },
158
+ {
159
+ class: "pl-3",
160
+ leading: true,
161
+ size: "sm"
162
+ },
163
+ {
164
+ class: "h-auto w-auto justify-start bg-transparent p-0 shadow-none outline-offset-4",
165
+ variant: "link"
166
+ }
167
+ ],
168
+ defaultVariants: {
169
+ accent: defaultTone,
170
+ fullWidth: false,
171
+ iconOnly: false,
172
+ leading: false,
173
+ size: "md",
174
+ trailing: false,
175
+ variant: "primary"
176
+ },
177
+ variants: {
178
+ accent: {
179
+ accent: "",
180
+ danger: "",
181
+ info: "",
182
+ success: "",
183
+ warning: ""
184
+ },
185
+ fullWidth: {
186
+ false: "",
187
+ true: "w-full"
188
+ },
189
+ iconOnly: {
190
+ false: "",
191
+ true: "aspect-square"
192
+ },
193
+ leading: {
194
+ false: "",
195
+ true: ""
196
+ },
197
+ size: buttonGeometry,
198
+ trailing: {
199
+ false: "",
200
+ true: ""
201
+ },
202
+ variant: {
203
+ danger: `${BLEND} text-tf-on-semantic blend-tf-danger`,
204
+ ghost: `${INK} text-tf-fg tf-plated-quiet ${CLOUD_ON_REACH}`,
205
+ info: `${BLEND} text-tf-on-semantic blend-tf-info`,
206
+ link: "text-tf-accent-hi underline underline-offset-2 interactive:hovered:text-tf-accent",
207
+ primary: `${BLEND} text-tf-on-accent blend-tf-accent`,
208
+ secondary: `${INK} text-tf-blend ${MARK_ON_REACH.accent} tf-glow tf-settled-quiet interactive:hovered:tf-blend-hushed interactive:hovered:tf-lit-rest ${CLOUD_INK} tf-blend-outline blend-tf-accent`,
209
+ success: `${BLEND} text-tf-on-semantic blend-tf-success`,
210
+ warning: `${BLEND} text-tf-on-semantic blend-tf-warning`
211
+ }
212
+ }
213
+ });
214
+ const buttonVariants = [
215
+ "primary",
216
+ "secondary",
217
+ "ghost",
218
+ "success",
219
+ "warning",
220
+ "danger",
221
+ "info",
222
+ "link"
223
+ ];
224
+ const buttonSizes = ["xs", ...controlSizes];
225
+ const buttonAccents = tones;
226
+ //#endregion
227
+ export { buttonAccents, buttonRecipe, buttonSizes, buttonSpinnerRecipe, buttonVariants, buttonWordsRecipe };
228
+
229
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","names":[],"sources":["../../src/recipes/button.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nimport type { ButtonSize } from '#control'\nimport {\n controlBase,\n controlBox,\n controlGap,\n controlInert,\n controlReach,\n controlSizes,\n hitArea,\n} from '#parts/control'\nimport { defaultTone, tones } from '#parts/tone'\nimport type { Tone } from '#tone'\nimport { toneBlend } from '#tone'\n\nconst HIT_AREA = hitArea('after:h-tf-target')\n\nconst QUIET_HIT = hitArea('after:h-tf-target', 'after:w-tf-target')\n\nconst buttonFace = [\n 'isolate',\n 'justify-center',\n 'whitespace-nowrap',\n 'tracking-tf-tight',\n 'tf-cloud-md',\n]\n\nconst buttonSpinnerRecipe = cva([\n 'absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n 'tf-arrives motion-reduce:transition-none',\n])\n\nconst buttonWordsRecipe = cva(\n [\n 'inline-flex items-center justify-center tf-text-trim',\n 'tf-crossfades motion-reduce:transition-none',\n 'in-data-loading:opacity-0',\n ],\n {\n defaultVariants: { size: 'md' },\n variants: { size: controlGap },\n },\n)\n\nconst buttonTempo = ['tf-blend-drift', 'tf-weather-trail']\n\nconst buttonGeometry = {\n lg: `${controlBox.lg} rounded-tf-card px-8 font-medium`,\n md: `${controlBox.md} rounded-tf-block px-6`,\n sm: `${controlBox.sm} px-4 ${HIT_AREA}`,\n xs: `${controlBox.xs} px-2 ${QUIET_HIT}`,\n} satisfies Record<ButtonSize, string>\n\ntype ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'ghost'\n | 'danger'\n | 'success'\n | 'warning'\n | 'info'\n | 'link'\ntype ButtonAccent = Tone\n\nconst CLOUD = ['tf-cloud-brand', 'tf-clouded', 'interactive:hovered:tf-clouding'].join(' ')\nconst CLOUD_INK = ['tf-cloud-ink', 'tf-clouded', 'interactive:hovered:tf-clouding'].join(' ')\nconst CLOUD_ON_REACH = [\n 'tf-cloud-ink',\n 'tf-cloud-hidden',\n 'interactive:hovered:tf-clouding',\n 'interactive:hovered:tf-plated',\n].join(' ')\n\nconst BLEND = [\n 'bg-tf-blend',\n CLOUD,\n 'tf-edge-sweep tf-edge-milk tf-swept-top',\n 'tf-glow tf-lit-rest tf-settled',\n 'interactive:hovered:tf-blended',\n 'interactive:hovered:tf-milked',\n 'interactive:hovered:tf-lit-inside',\n 'interactive:hovered:tf-lifted',\n 'interactive:pressed:tf-pressed',\n 'motion-safe:interactive:pressed:tf-tilted',\n].join(' ')\nconst INK = [\n 'tf-ink-glide',\n 'data-loading:bg-none',\n '[&_svg]:tf-transition [&_svg]:text-tf-muted',\n].join(' ')\n\nconst MARK_ON_REACH = {\n accent: 'interactive:hovered:[&_svg]:text-tf-accent-hi',\n danger: 'interactive:hovered:[&_svg]:text-tf-danger-hi',\n info: 'interactive:hovered:[&_svg]:text-tf-info-hi',\n success: 'interactive:hovered:[&_svg]:text-tf-success-hi',\n warning: 'interactive:hovered:[&_svg]:text-tf-warning-hi',\n} satisfies Record<Tone, string>\n\nconst WORDS_ON_REACH = {\n accent: 'interactive:hovered:text-tf-accent-hi',\n danger: 'interactive:hovered:text-tf-danger-hi',\n info: 'interactive:hovered:text-tf-info-hi',\n success: 'interactive:hovered:text-tf-success-hi',\n warning: 'interactive:hovered:text-tf-warning-hi',\n} satisfies Record<Tone, string>\n\nconst FLAT_INK = 'text-tf-muted interactive:hovered:text-tf-fg'\n\nconst buttonPress = [\n 'motion-safe:interactive:pressed:translate-y-px',\n 'motion-reduce:interactive:pressed:brightness-95',\n]\n\nconst buttonRecipe = cva(\n [\n ...controlBase,\n ...buttonFace,\n ...buttonTempo,\n ...controlReach,\n ...buttonPress,\n ...controlInert,\n 'data-loading:opacity-100',\n ],\n {\n compoundVariants: [\n {\n class: 'tf-cloud-tight',\n variant: 'ghost',\n },\n ...tones.map((accent) => ({\n accent,\n class: `${toneBlend[accent]} ${WORDS_ON_REACH[accent]} ${MARK_ON_REACH[accent]}`,\n variant: 'ghost' as const,\n })),\n {\n class: FLAT_INK,\n iconOnly: true,\n variant: 'ghost',\n },\n {\n class: FLAT_INK,\n iconOnly: true,\n variant: 'secondary',\n },\n {\n class: 'px-0',\n iconOnly: true,\n },\n {\n class: 'tf-icons-solo [&_svg]:size-tf-icon-solo-xs',\n iconOnly: true,\n size: 'xs',\n },\n {\n class: 'tf-icons-solo [&_svg]:size-tf-icon-solo-sm',\n iconOnly: true,\n size: 'sm',\n },\n {\n class: 'tf-icons-solo [&_svg]:size-tf-icon-solo-md',\n iconOnly: true,\n size: 'md',\n },\n {\n class: 'tf-icons-solo [&_svg]:size-tf-icon-solo-lg',\n iconOnly: true,\n size: 'lg',\n },\n {\n class: 'pr-7',\n size: 'lg',\n trailing: true,\n },\n {\n class: 'pr-5',\n size: 'md',\n trailing: true,\n },\n {\n class: 'pr-3',\n size: 'sm',\n trailing: true,\n },\n {\n class: 'pl-7',\n leading: true,\n size: 'lg',\n },\n {\n class: 'pl-5',\n leading: true,\n size: 'md',\n },\n {\n class: 'pl-3',\n leading: true,\n size: 'sm',\n },\n {\n class: 'h-auto w-auto justify-start bg-transparent p-0 shadow-none outline-offset-4',\n variant: 'link',\n },\n ],\n defaultVariants: {\n accent: defaultTone,\n fullWidth: false,\n iconOnly: false,\n leading: false,\n size: 'md',\n trailing: false,\n variant: 'primary',\n },\n variants: {\n accent: {\n accent: '',\n danger: '',\n info: '',\n success: '',\n warning: '',\n } satisfies Record<ButtonAccent, string>,\n fullWidth: {\n false: '',\n true: 'w-full',\n },\n iconOnly: {\n false: '',\n true: 'aspect-square',\n },\n leading: {\n false: '',\n true: '',\n },\n size: buttonGeometry,\n trailing: {\n false: '',\n true: '',\n },\n variant: {\n danger: `${BLEND} text-tf-on-semantic blend-tf-danger`,\n ghost: `${INK} text-tf-fg tf-plated-quiet ${CLOUD_ON_REACH}`,\n info: `${BLEND} text-tf-on-semantic blend-tf-info`,\n link: 'text-tf-accent-hi underline underline-offset-2 interactive:hovered:text-tf-accent',\n primary: `${BLEND} text-tf-on-accent blend-tf-accent`,\n secondary: `${INK} text-tf-blend ${MARK_ON_REACH.accent} tf-glow tf-settled-quiet interactive:hovered:tf-blend-hushed interactive:hovered:tf-lit-rest ${CLOUD_INK} tf-blend-outline blend-tf-accent`,\n success: `${BLEND} text-tf-on-semantic blend-tf-success`,\n warning: `${BLEND} text-tf-on-semantic blend-tf-warning`,\n } satisfies Record<ButtonVariant, string>,\n },\n },\n)\n\nconst buttonVariants = [\n 'primary',\n 'secondary',\n 'ghost',\n 'success',\n 'warning',\n 'danger',\n 'info',\n 'link',\n] as const satisfies readonly ButtonVariant[]\n\nconst buttonSizes = ['xs', ...controlSizes] as const satisfies readonly ButtonSize[]\n\nconst buttonAccents = tones\n\nexport {\n type ButtonAccent,\n type ButtonVariant,\n buttonRecipe,\n buttonSizes,\n buttonSpinnerRecipe,\n buttonAccents,\n buttonVariants,\n buttonWordsRecipe,\n}\n"],"mappings":";;;;;AAgBA,MAAM,WAAW,QAAQ,mBAAmB;AAE5C,MAAM,YAAY,QAAQ,qBAAqB,mBAAmB;AAElE,MAAM,aAAa;CACjB;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,sBAAsB,IAAI,CAC9B,+DACA,0CACF,CAAC;AAED,MAAM,oBAAoB,IACxB;CACE;CACA;CACA;AACF,GACA;CACE,iBAAiB,EAAE,MAAM,KAAK;CAC9B,UAAU,EAAE,MAAM,WAAW;AAC/B,CACF;AAEA,MAAM,cAAc,CAAC,kBAAkB,kBAAkB;AAEzD,MAAM,iBAAiB;CACrB,IAAI,GAAG,WAAW,GAAG;CACrB,IAAI,GAAG,WAAW,GAAG;CACrB,IAAI,GAAG,WAAW,GAAG,QAAQ;CAC7B,IAAI,GAAG,WAAW,GAAG,QAAQ;AAC/B;AAaA,MAAM,QAAQ;CAAC;CAAkB;CAAc;AAAiC,CAAC,CAAC,KAAK,GAAG;AAC1F,MAAM,YAAY;CAAC;CAAgB;CAAc;AAAiC,CAAC,CAAC,KAAK,GAAG;AAC5F,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,MAAM,QAAQ;CACZ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AACV,MAAM,MAAM;CACV;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,MAAM,gBAAgB;CACpB,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;AACX;AAEA,MAAM,iBAAiB;CACrB,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;AACX;AAEA,MAAM,WAAW;AAEjB,MAAM,cAAc,CAClB,kDACA,iDACF;AAEA,MAAM,eAAe,IACnB;CACE,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH;AACF,GACA;CACE,kBAAkB;EAChB;GACE,OAAO;GACP,SAAS;EACX;EACA,GAAG,MAAM,KAAK,YAAY;GACxB;GACA,OAAO,GAAG,UAAU,QAAQ,GAAG,eAAe,QAAQ,GAAG,cAAc;GACvE,SAAS;EACX,EAAE;EACF;GACE,OAAO;GACP,UAAU;GACV,SAAS;EACX;EACA;GACE,OAAO;GACP,UAAU;GACV,SAAS;EACX;EACA;GACE,OAAO;GACP,UAAU;EACZ;EACA;GACE,OAAO;GACP,UAAU;GACV,MAAM;EACR;EACA;GACE,OAAO;GACP,UAAU;GACV,MAAM;EACR;EACA;GACE,OAAO;GACP,UAAU;GACV,MAAM;EACR;EACA;GACE,OAAO;GACP,UAAU;GACV,MAAM;EACR;EACA;GACE,OAAO;GACP,MAAM;GACN,UAAU;EACZ;EACA;GACE,OAAO;GACP,MAAM;GACN,UAAU;EACZ;EACA;GACE,OAAO;GACP,MAAM;GACN,UAAU;EACZ;EACA;GACE,OAAO;GACP,SAAS;GACT,MAAM;EACR;EACA;GACE,OAAO;GACP,SAAS;GACT,MAAM;EACR;EACA;GACE,OAAO;GACP,SAAS;GACT,MAAM;EACR;EACA;GACE,OAAO;GACP,SAAS;EACX;CACF;CACA,iBAAiB;EACf,QAAQ;EACR,WAAW;EACX,UAAU;EACV,SAAS;EACT,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,UAAU;EACR,QAAQ;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;EACX;EACA,WAAW;GACT,OAAO;GACP,MAAM;EACR;EACA,UAAU;GACR,OAAO;GACP,MAAM;EACR;EACA,SAAS;GACP,OAAO;GACP,MAAM;EACR;EACA,MAAM;EACN,UAAU;GACR,OAAO;GACP,MAAM;EACR;EACA,SAAS;GACP,QAAQ,GAAG,MAAM;GACjB,OAAO,GAAG,IAAI,8BAA8B;GAC5C,MAAM,GAAG,MAAM;GACf,MAAM;GACN,SAAS,GAAG,MAAM;GAClB,WAAW,GAAG,IAAI,iBAAiB,cAAc,OAAO,gGAAgG,UAAU;GAClK,SAAS,GAAG,MAAM;GAClB,SAAS,GAAG,MAAM;EACpB;CACF;AACF,CACF;AAEA,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,cAAc,CAAC,MAAM,GAAG,YAAY;AAE1C,MAAM,gBAAgB"}
@@ -0,0 +1,10 @@
1
+ //#region src/recipes/cardHeader.d.ts
2
+ type CardHeaderRank = 'card' | 'module';
3
+ declare const defaultCardHeaderRank = "card";
4
+ declare const cardHeaderRanks: readonly ["card", "module"];
5
+ declare const cardHeaderRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
6
+ declare const cardHeaderStackRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
7
+ declare const cardHeaderActionRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
8
+ //#endregion
9
+ export { type CardHeaderRank, cardHeaderActionRecipe, cardHeaderRanks, cardHeaderRecipe, cardHeaderStackRecipe, defaultCardHeaderRank };
10
+ //# sourceMappingURL=cardHeader.d.ts.map
@@ -0,0 +1,11 @@
1
+ import { cva } from "class-variance-authority";
2
+ //#region src/recipes/cardHeader.ts
3
+ const defaultCardHeaderRank = "card";
4
+ const cardHeaderRanks = ["card", "module"];
5
+ const cardHeaderRecipe = cva("flex min-w-0 items-center gap-4");
6
+ const cardHeaderStackRecipe = cva("flex min-w-0 flex-col gap-0");
7
+ const cardHeaderActionRecipe = cva("ml-auto flex-none");
8
+ //#endregion
9
+ export { cardHeaderActionRecipe, cardHeaderRanks, cardHeaderRecipe, cardHeaderStackRecipe, defaultCardHeaderRank };
10
+
11
+ //# sourceMappingURL=cardHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardHeader.js","names":[],"sources":["../../src/recipes/cardHeader.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\ntype CardHeaderRank = 'card' | 'module'\n\nconst defaultCardHeaderRank = 'card' satisfies CardHeaderRank\n\nconst cardHeaderRanks = ['card', 'module'] as const satisfies readonly CardHeaderRank[]\n\nconst cardHeaderRecipe = cva('flex min-w-0 items-center gap-4')\n\nconst cardHeaderStackRecipe = cva('flex min-w-0 flex-col gap-0')\n\nconst cardHeaderActionRecipe = cva('ml-auto flex-none')\n\nexport {\n type CardHeaderRank,\n cardHeaderActionRecipe,\n cardHeaderRanks,\n cardHeaderRecipe,\n cardHeaderStackRecipe,\n defaultCardHeaderRank,\n}\n"],"mappings":";;AAIA,MAAM,wBAAwB;AAE9B,MAAM,kBAAkB,CAAC,QAAQ,QAAQ;AAEzC,MAAM,mBAAmB,IAAI,iCAAiC;AAE9D,MAAM,wBAAwB,IAAI,6BAA6B;AAE/D,MAAM,yBAAyB,IAAI,mBAAmB"}
@@ -0,0 +1,26 @@
1
+ import { Tone } from "../tone.js";
2
+ //#region src/recipes/checkbox.d.ts
3
+ declare const checkboxAccents: readonly ["accent", "success", "warning", "info", "danger"];
4
+ type CheckboxAccent = Tone;
5
+ declare const defaultCheckboxAccent = "accent";
6
+ declare const checkboxRecipe: (props?: ({
7
+ labelled?: boolean | null | undefined;
8
+ plate?: "full" | "snug" | "bare" | null | undefined;
9
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
+ declare const checkboxControlRecipe: (props?: ({
11
+ accent?: "accent" | "success" | "warning" | "info" | "danger" | null | undefined;
12
+ invalid?: boolean | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ declare const checkboxIndicatorRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
15
+ declare const checkboxMarkRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
16
+ declare const checkboxDashRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
17
+ declare const checkboxLabelRecipe: (props?: ({
18
+ hidden?: boolean | null | undefined;
19
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
20
+ declare const checkboxTitleRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
21
+ declare const checkboxHintRecipe: (props?: ({
22
+ invalid?: boolean | null | undefined;
23
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
24
+ //#endregion
25
+ export { type CheckboxAccent, checkboxAccents, checkboxControlRecipe, checkboxDashRecipe, checkboxHintRecipe, checkboxIndicatorRecipe, checkboxLabelRecipe, checkboxMarkRecipe, checkboxRecipe, checkboxTitleRecipe, defaultCheckboxAccent };
26
+ //# sourceMappingURL=checkbox.d.ts.map
@@ -0,0 +1,103 @@
1
+ import { defaultMarkPlate, markPlates } from "../mark.js";
2
+ import { toneBlend } from "../tone.js";
3
+ import { defaultTone, tones } from "../parts/tone.js";
4
+ import { markBox, markFailed, markPlate, markPlated, markPress, markRow, markSquare, markStack, markTitle } from "../parts/mark.js";
5
+ import { cva } from "class-variance-authority";
6
+ //#region src/recipes/checkbox.ts
7
+ const checkboxAccents = tones;
8
+ const defaultCheckboxAccent = defaultTone;
9
+ const FILL = ["bg-tf-sunken", "tf-ramp"];
10
+ const OFF = ["data-[state=unchecked]:interactive:not-data-readonly:hovered:bg-tf-sunken-hi"];
11
+ const ON = [
12
+ "data-[state=checked]:tf-mark-lit",
13
+ "data-[state=checked]:bg-tf-blend",
14
+ "data-[state=checked]:text-tf-on-accent",
15
+ "data-[state=checked]:tf-icons-solo",
16
+ "data-[state=checked]:interactive:not-data-readonly:hovered:tf-blended"
17
+ ];
18
+ const MIXED = [
19
+ "data-[state=indeterminate]:tf-mark-lit",
20
+ "data-[state=indeterminate]:bg-tf-blend",
21
+ "data-[state=indeterminate]:text-tf-on-accent",
22
+ "data-[state=indeterminate]:interactive:not-data-readonly:hovered:tf-blended"
23
+ ];
24
+ const GAPS = {
25
+ bare: "gap-2",
26
+ full: "gap-3",
27
+ snug: "gap-2"
28
+ };
29
+ const platedRows = markPlates.map((plate) => ({
30
+ class: `${GAPS[plate]} ${markPlate[plate]} ${markPlated[plate]}`,
31
+ labelled: true,
32
+ plate
33
+ }));
34
+ const platedSquares = markPlates.map((plate) => ({
35
+ class: `${markSquare[plate]} ${markPlated[plate]}`,
36
+ labelled: false,
37
+ plate
38
+ }));
39
+ const checkboxRecipe = cva(markRow, {
40
+ compoundVariants: [...platedRows, ...platedSquares],
41
+ defaultVariants: {
42
+ labelled: true,
43
+ plate: defaultMarkPlate
44
+ },
45
+ variants: {
46
+ labelled: {
47
+ false: "",
48
+ true: ""
49
+ },
50
+ plate: {
51
+ bare: "",
52
+ full: "",
53
+ snug: ""
54
+ }
55
+ }
56
+ });
57
+ const checkboxControlRecipe = cva([
58
+ ...markBox,
59
+ "rounded-tf-inline",
60
+ markPress,
61
+ ...FILL,
62
+ ...OFF,
63
+ ...ON,
64
+ ...MIXED
65
+ ], {
66
+ compoundVariants: [{
67
+ class: toneBlend.danger,
68
+ invalid: true
69
+ }],
70
+ defaultVariants: {
71
+ accent: defaultCheckboxAccent,
72
+ invalid: false
73
+ },
74
+ variants: {
75
+ accent: toneBlend,
76
+ invalid: {
77
+ false: "",
78
+ true: markFailed
79
+ }
80
+ }
81
+ });
82
+ const checkboxIndicatorRecipe = cva("inline-flex tf-mark-draws items-center justify-center");
83
+ const checkboxMarkRecipe = cva("size-tf-mark-glyph");
84
+ const checkboxDashRecipe = cva(["block h-[calc(var(--spacing-tf-hairline)*2)] w-tf-mark-dot rounded-tf-pill", "bg-tf-on-accent"]);
85
+ const checkboxLabelRecipe = cva([...markStack, "flex-1"], {
86
+ defaultVariants: { hidden: false },
87
+ variants: { hidden: {
88
+ false: "",
89
+ true: "sr-only"
90
+ } }
91
+ });
92
+ const checkboxTitleRecipe = cva(markTitle);
93
+ const checkboxHintRecipe = cva("text-tf-caption font-medium", {
94
+ defaultVariants: { invalid: false },
95
+ variants: { invalid: {
96
+ false: "text-tf-muted",
97
+ true: "text-tf-danger-hi tf-arrives"
98
+ } }
99
+ });
100
+ //#endregion
101
+ export { checkboxAccents, checkboxControlRecipe, checkboxDashRecipe, checkboxHintRecipe, checkboxIndicatorRecipe, checkboxLabelRecipe, checkboxMarkRecipe, checkboxRecipe, checkboxTitleRecipe, defaultCheckboxAccent };
102
+
103
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../src/recipes/checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nimport type { MarkPlate } from '#mark'\nimport { defaultMarkPlate, markPlates } from '#mark'\nimport {\n markBox,\n markFailed,\n markPlate,\n markPlated,\n markPress,\n markRow,\n markSquare,\n markStack,\n markTitle,\n} from '#parts/mark'\nimport { defaultTone, tones } from '#parts/tone'\nimport type { Tone } from '#tone'\nimport { toneBlend } from '#tone'\n\nconst checkboxAccents = tones\n\ntype CheckboxAccent = Tone\n\nconst defaultCheckboxAccent = defaultTone\n\nconst FILL = ['bg-tf-sunken', 'tf-ramp']\n\nconst OFF = ['data-[state=unchecked]:interactive:not-data-readonly:hovered:bg-tf-sunken-hi']\n\nconst ON = [\n 'data-[state=checked]:tf-mark-lit',\n 'data-[state=checked]:bg-tf-blend',\n 'data-[state=checked]:text-tf-on-accent',\n 'data-[state=checked]:tf-icons-solo',\n 'data-[state=checked]:interactive:not-data-readonly:hovered:tf-blended',\n]\n\nconst MIXED = [\n 'data-[state=indeterminate]:tf-mark-lit',\n 'data-[state=indeterminate]:bg-tf-blend',\n 'data-[state=indeterminate]:text-tf-on-accent',\n 'data-[state=indeterminate]:interactive:not-data-readonly:hovered:tf-blended',\n]\n\nconst GAPS = { bare: 'gap-2', full: 'gap-3', snug: 'gap-2' } satisfies Record<MarkPlate, string>\n\nconst platedRows = markPlates.map((plate) => ({\n class: `${GAPS[plate]} ${markPlate[plate]} ${markPlated[plate]}`,\n labelled: true,\n plate,\n}))\n\nconst platedSquares = markPlates.map((plate) => ({\n class: `${markSquare[plate]} ${markPlated[plate]}`,\n labelled: false,\n plate,\n}))\n\nconst checkboxRecipe = cva(markRow, {\n compoundVariants: [...platedRows, ...platedSquares],\n defaultVariants: { labelled: true, plate: defaultMarkPlate },\n variants: {\n labelled: { false: '', true: '' },\n plate: { bare: '', full: '', snug: '' } satisfies Record<MarkPlate, string>,\n },\n})\n\nconst checkboxControlRecipe = cva(\n [...markBox, 'rounded-tf-inline', markPress, ...FILL, ...OFF, ...ON, ...MIXED],\n {\n compoundVariants: [{ class: toneBlend.danger, invalid: true }],\n defaultVariants: { accent: defaultCheckboxAccent, invalid: false },\n variants: {\n accent: toneBlend,\n invalid: { false: '', true: markFailed },\n },\n },\n)\n\nconst checkboxIndicatorRecipe = cva('inline-flex tf-mark-draws items-center justify-center')\n\nconst checkboxMarkRecipe = cva('size-tf-mark-glyph')\n\nconst checkboxDashRecipe = cva([\n 'block h-[calc(var(--spacing-tf-hairline)*2)] w-tf-mark-dot rounded-tf-pill',\n 'bg-tf-on-accent',\n])\n\nconst checkboxLabelRecipe = cva([...markStack, 'flex-1'], {\n defaultVariants: { hidden: false },\n variants: {\n hidden: { false: '', true: 'sr-only' },\n },\n})\n\nconst checkboxTitleRecipe = cva(markTitle)\n\nconst checkboxHintRecipe = cva('text-tf-caption font-medium', {\n defaultVariants: { invalid: false },\n variants: {\n invalid: { false: 'text-tf-muted', true: 'text-tf-danger-hi tf-arrives' },\n },\n})\n\nexport {\n type CheckboxAccent,\n checkboxAccents,\n checkboxControlRecipe,\n checkboxDashRecipe,\n checkboxHintRecipe,\n checkboxIndicatorRecipe,\n checkboxLabelRecipe,\n checkboxMarkRecipe,\n checkboxRecipe,\n checkboxTitleRecipe,\n defaultCheckboxAccent,\n}\n"],"mappings":";;;;;;AAmBA,MAAM,kBAAkB;AAIxB,MAAM,wBAAwB;AAE9B,MAAM,OAAO,CAAC,gBAAgB,SAAS;AAEvC,MAAM,MAAM,CAAC,8EAA8E;AAE3F,MAAM,KAAK;CACT;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,QAAQ;CACZ;CACA;CACA;CACA;AACF;AAEA,MAAM,OAAO;CAAE,MAAM;CAAS,MAAM;CAAS,MAAM;AAAQ;AAE3D,MAAM,aAAa,WAAW,KAAK,WAAW;CAC5C,OAAO,GAAG,KAAK,OAAO,GAAG,UAAU,OAAO,GAAG,WAAW;CACxD,UAAU;CACV;AACF,EAAE;AAEF,MAAM,gBAAgB,WAAW,KAAK,WAAW;CAC/C,OAAO,GAAG,WAAW,OAAO,GAAG,WAAW;CAC1C,UAAU;CACV;AACF,EAAE;AAEF,MAAM,iBAAiB,IAAI,SAAS;CAClC,kBAAkB,CAAC,GAAG,YAAY,GAAG,aAAa;CAClD,iBAAiB;EAAE,UAAU;EAAM,OAAO;CAAiB;CAC3D,UAAU;EACR,UAAU;GAAE,OAAO;GAAI,MAAM;EAAG;EAChC,OAAO;GAAE,MAAM;GAAI,MAAM;GAAI,MAAM;EAAG;CACxC;AACF,CAAC;AAED,MAAM,wBAAwB,IAC5B;CAAC,GAAG;CAAS;CAAqB;CAAW,GAAG;CAAM,GAAG;CAAK,GAAG;CAAI,GAAG;AAAK,GAC7E;CACE,kBAAkB,CAAC;EAAE,OAAO,UAAU;EAAQ,SAAS;CAAK,CAAC;CAC7D,iBAAiB;EAAE,QAAQ;EAAuB,SAAS;CAAM;CACjE,UAAU;EACR,QAAQ;EACR,SAAS;GAAE,OAAO;GAAI,MAAM;EAAW;CACzC;AACF,CACF;AAEA,MAAM,0BAA0B,IAAI,uDAAuD;AAE3F,MAAM,qBAAqB,IAAI,oBAAoB;AAEnD,MAAM,qBAAqB,IAAI,CAC7B,8EACA,iBACF,CAAC;AAED,MAAM,sBAAsB,IAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;CACxD,iBAAiB,EAAE,QAAQ,MAAM;CACjC,UAAU,EACR,QAAQ;EAAE,OAAO;EAAI,MAAM;CAAU,EACvC;AACF,CAAC;AAED,MAAM,sBAAsB,IAAI,SAAS;AAEzC,MAAM,qBAAqB,IAAI,+BAA+B;CAC5D,iBAAiB,EAAE,SAAS,MAAM;CAClC,UAAU,EACR,SAAS;EAAE,OAAO;EAAiB,MAAM;CAA+B,EAC1E;AACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ //#region src/recipes/chip.d.ts
2
+ type ChipTone = 'quiet' | 'outline' | 'tint';
3
+ type ChipSize = 'sm' | 'md';
4
+ type ChipAccent = 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
5
+ declare const defaultChipTone = "quiet";
6
+ declare const defaultChipSize = "md";
7
+ declare const defaultChipAccent = "neutral";
8
+ declare const chipTones: readonly ["quiet", "outline", "tint"];
9
+ declare const chipSizes: readonly ["sm", "md"];
10
+ declare const chipAccents: readonly ["neutral", "accent", "info", "success", "warning", "danger"];
11
+ declare const chipRecipe: (props?: ({
12
+ accent?: "accent" | "success" | "warning" | "info" | "danger" | "neutral" | null | undefined;
13
+ removable?: boolean | null | undefined;
14
+ size?: "sm" | "md" | null | undefined;
15
+ tone?: "quiet" | "outline" | "tint" | null | undefined;
16
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
17
+ declare const chipDotRecipe: (props?: ({
18
+ accent?: "accent" | "success" | "warning" | "info" | "danger" | "neutral" | null | undefined;
19
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
20
+ declare const chipTextRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
21
+ declare const chipLabelRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
22
+ declare const chipCountRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
23
+ declare const chipCloseRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
24
+ //#endregion
25
+ export { type ChipAccent, type ChipSize, type ChipTone, chipAccents, chipCloseRecipe, chipCountRecipe, chipDotRecipe, chipLabelRecipe, chipRecipe, chipSizes, chipTextRecipe, chipTones, defaultChipAccent, defaultChipSize, defaultChipTone };
26
+ //# sourceMappingURL=chip.d.ts.map
@@ -0,0 +1,123 @@
1
+ import { controlPress, controlReach, hitArea } from "../parts/control.js";
2
+ import { cva } from "class-variance-authority";
3
+ //#region src/recipes/chip.ts
4
+ const defaultChipTone = "quiet";
5
+ const defaultChipSize = "md";
6
+ const defaultChipAccent = "neutral";
7
+ const chipTones = [
8
+ "quiet",
9
+ "outline",
10
+ "tint"
11
+ ];
12
+ const chipSizes = ["sm", "md"];
13
+ const chipAccents = [
14
+ "neutral",
15
+ "accent",
16
+ "info",
17
+ "success",
18
+ "warning",
19
+ "danger"
20
+ ];
21
+ const HIT_AREA = hitArea("after:h-tf-target");
22
+ const TINT = {
23
+ accent: "bg-tf-accent-tint text-tf-accent-hi [--tf-mark-rest:var(--color-tf-accent-edge)]",
24
+ danger: "bg-tf-danger-tint text-tf-danger-hi [--tf-mark-rest:var(--color-tf-danger-edge)]",
25
+ info: "bg-tf-info-tint text-tf-info-hi [--tf-mark-rest:var(--color-tf-info-edge)]",
26
+ neutral: "bg-tf-panel text-tf-fg",
27
+ success: "bg-tf-success-tint text-tf-success-hi [--tf-mark-rest:var(--color-tf-success-edge)]",
28
+ warning: "bg-tf-warning-tint text-tf-warning-hi [--tf-mark-rest:var(--color-tf-warning-edge)]"
29
+ };
30
+ const OUTLINE = {
31
+ accent: "text-tf-accent-hi blend-tf-accent",
32
+ danger: "text-tf-danger-hi blend-tf-danger",
33
+ info: "text-tf-info-hi blend-tf-info",
34
+ neutral: "text-tf-fg blend-tf-accent",
35
+ success: "text-tf-success-hi blend-tf-success",
36
+ warning: "text-tf-warning-hi blend-tf-warning"
37
+ };
38
+ const LEAVES = [
39
+ "motion-safe:tf-chip-arrives",
40
+ "data-[state=closed]:overflow-hidden",
41
+ "data-[state=closed]:**:data-[part=label]:flex-none",
42
+ "data-[state=closed]:motion-safe:tf-chip-departs",
43
+ "motion-reduce:animate-none"
44
+ ].join(" ");
45
+ const chipRecipe = cva([
46
+ "relative isolate inline-flex max-w-full min-w-0 flex-none items-center rounded-tf-pill",
47
+ "font-tf-body font-medium whitespace-nowrap",
48
+ "tf-icons [&>svg]:shrink-0",
49
+ "data-disabled:opacity-50",
50
+ "tf-transition motion-reduce:transition-none"
51
+ ], {
52
+ compoundVariants: [...chipAccents.map((accent) => ({
53
+ accent,
54
+ class: TINT[accent],
55
+ tone: "tint"
56
+ })), ...chipAccents.map((accent) => ({
57
+ accent,
58
+ class: OUTLINE[accent],
59
+ tone: "outline"
60
+ }))],
61
+ defaultVariants: {
62
+ accent: defaultChipAccent,
63
+ removable: false,
64
+ size: "md",
65
+ tone: defaultChipTone
66
+ },
67
+ variants: {
68
+ accent: {
69
+ accent: "",
70
+ danger: "",
71
+ info: "",
72
+ neutral: "",
73
+ success: "",
74
+ warning: ""
75
+ },
76
+ removable: {
77
+ false: "",
78
+ true: LEAVES
79
+ },
80
+ size: {
81
+ md: "h-tf-row gap-2 px-3 text-tf-body-sm [&>svg]:size-tf-icon-sm",
82
+ sm: "h-tf-chip-sm gap-1.5 px-2 text-tf-caption-sm [&>svg]:size-tf-icon-2xs"
83
+ },
84
+ tone: {
85
+ outline: "tf-blend-outline",
86
+ quiet: "bg-tf-panel text-tf-fg tf-mark-edge",
87
+ tint: "tf-mark-edge **:data-[part=count]:text-current"
88
+ }
89
+ }
90
+ });
91
+ const chipDotRecipe = cva("size-2 flex-none rounded-tf-pill", {
92
+ defaultVariants: { accent: defaultChipAccent },
93
+ variants: { accent: {
94
+ accent: "bg-tf-accent-hi",
95
+ danger: "bg-tf-danger-hi",
96
+ info: "bg-tf-info-hi",
97
+ neutral: "bg-tf-muted",
98
+ success: "bg-tf-success-hi",
99
+ warning: "bg-tf-warning-hi"
100
+ } }
101
+ });
102
+ const chipTextRecipe = cva("flex min-w-0 items-baseline gap-[inherit]");
103
+ const chipLabelRecipe = cva("min-w-0 truncate");
104
+ const chipCountRecipe = cva("flex-none font-mono text-tf-caption-sm text-tf-muted tabular-nums");
105
+ const CLOSE_HELD = [
106
+ "disabled:cursor-not-allowed",
107
+ "aria-disabled:cursor-not-allowed",
108
+ "data-disabled:cursor-not-allowed"
109
+ ];
110
+ const chipCloseRecipe = cva([
111
+ "relative inline-flex size-tf-icon-md flex-none items-center justify-center rounded-tf-pill",
112
+ "[&_svg]:size-tf-icon-2xs [&_svg]:shrink-0",
113
+ "text-tf-muted interactive:hovered:bg-tf-panel-hi interactive:hovered:text-tf-fg",
114
+ "cursor-pointer tf-transition motion-reduce:transition-none",
115
+ HIT_AREA,
116
+ ...controlReach,
117
+ ...controlPress,
118
+ ...CLOSE_HELD
119
+ ]);
120
+ //#endregion
121
+ export { chipAccents, chipCloseRecipe, chipCountRecipe, chipDotRecipe, chipLabelRecipe, chipRecipe, chipSizes, chipTextRecipe, chipTones, defaultChipAccent, defaultChipSize, defaultChipTone };
122
+
123
+ //# sourceMappingURL=chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chip.js","names":[],"sources":["../../src/recipes/chip.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nimport { controlPress, controlReach, hitArea } from '#parts/control'\n\ntype ChipTone = 'quiet' | 'outline' | 'tint'\n\ntype ChipSize = 'sm' | 'md'\n\ntype ChipAccent = 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger'\n\nconst defaultChipTone = 'quiet' satisfies ChipTone\n\nconst defaultChipSize = 'md' satisfies ChipSize\n\nconst defaultChipAccent = 'neutral' satisfies ChipAccent\n\nconst chipTones = ['quiet', 'outline', 'tint'] as const satisfies readonly ChipTone[]\n\nconst chipSizes = ['sm', 'md'] as const satisfies readonly ChipSize[]\n\nconst chipAccents = [\n 'neutral',\n 'accent',\n 'info',\n 'success',\n 'warning',\n 'danger',\n] as const satisfies readonly ChipAccent[]\n\nconst HIT_AREA = hitArea('after:h-tf-target')\n\nconst TINT = {\n accent: 'bg-tf-accent-tint text-tf-accent-hi [--tf-mark-rest:var(--color-tf-accent-edge)]',\n danger: 'bg-tf-danger-tint text-tf-danger-hi [--tf-mark-rest:var(--color-tf-danger-edge)]',\n info: 'bg-tf-info-tint text-tf-info-hi [--tf-mark-rest:var(--color-tf-info-edge)]',\n neutral: 'bg-tf-panel text-tf-fg',\n success: 'bg-tf-success-tint text-tf-success-hi [--tf-mark-rest:var(--color-tf-success-edge)]',\n warning: 'bg-tf-warning-tint text-tf-warning-hi [--tf-mark-rest:var(--color-tf-warning-edge)]',\n} satisfies Record<ChipAccent, string>\n\nconst OUTLINE = {\n accent: 'text-tf-accent-hi blend-tf-accent',\n danger: 'text-tf-danger-hi blend-tf-danger',\n info: 'text-tf-info-hi blend-tf-info',\n neutral: 'text-tf-fg blend-tf-accent',\n success: 'text-tf-success-hi blend-tf-success',\n warning: 'text-tf-warning-hi blend-tf-warning',\n} satisfies Record<ChipAccent, string>\n\nconst LEAVES = [\n 'motion-safe:tf-chip-arrives',\n 'data-[state=closed]:overflow-hidden',\n 'data-[state=closed]:**:data-[part=label]:flex-none',\n 'data-[state=closed]:motion-safe:tf-chip-departs',\n 'motion-reduce:animate-none',\n].join(' ')\n\nconst chipRecipe = cva(\n [\n 'relative isolate inline-flex max-w-full min-w-0 flex-none items-center rounded-tf-pill',\n 'font-tf-body font-medium whitespace-nowrap',\n 'tf-icons [&>svg]:shrink-0',\n 'data-disabled:opacity-50',\n 'tf-transition motion-reduce:transition-none',\n ],\n {\n compoundVariants: [\n ...chipAccents.map((accent) => ({ accent, class: TINT[accent], tone: 'tint' as const })),\n ...chipAccents.map((accent) => ({\n accent,\n class: OUTLINE[accent],\n tone: 'outline' as const,\n })),\n ],\n defaultVariants: {\n accent: defaultChipAccent,\n removable: false,\n size: defaultChipSize,\n tone: defaultChipTone,\n },\n variants: {\n accent: {\n accent: '',\n danger: '',\n info: '',\n neutral: '',\n success: '',\n warning: '',\n } satisfies Record<ChipAccent, string>,\n removable: { false: '', true: LEAVES },\n size: {\n md: 'h-tf-row gap-2 px-3 text-tf-body-sm [&>svg]:size-tf-icon-sm',\n sm: 'h-tf-chip-sm gap-1.5 px-2 text-tf-caption-sm [&>svg]:size-tf-icon-2xs',\n } satisfies Record<ChipSize, string>,\n tone: {\n outline: 'tf-blend-outline',\n quiet: 'bg-tf-panel text-tf-fg tf-mark-edge',\n tint: 'tf-mark-edge **:data-[part=count]:text-current',\n } satisfies Record<ChipTone, string>,\n },\n },\n)\n\nconst chipDotRecipe = cva('size-2 flex-none rounded-tf-pill', {\n defaultVariants: { accent: defaultChipAccent },\n variants: {\n accent: {\n accent: 'bg-tf-accent-hi',\n danger: 'bg-tf-danger-hi',\n info: 'bg-tf-info-hi',\n neutral: 'bg-tf-muted',\n success: 'bg-tf-success-hi',\n warning: 'bg-tf-warning-hi',\n } satisfies Record<ChipAccent, string>,\n },\n})\n\nconst chipTextRecipe = cva('flex min-w-0 items-baseline gap-[inherit]')\n\nconst chipLabelRecipe = cva('min-w-0 truncate')\n\nconst chipCountRecipe = cva('flex-none font-mono text-tf-caption-sm text-tf-muted tabular-nums')\n\nconst CLOSE_HELD = [\n 'disabled:cursor-not-allowed',\n 'aria-disabled:cursor-not-allowed',\n 'data-disabled:cursor-not-allowed',\n]\n\nconst chipCloseRecipe = cva([\n 'relative inline-flex size-tf-icon-md flex-none items-center justify-center rounded-tf-pill',\n '[&_svg]:size-tf-icon-2xs [&_svg]:shrink-0',\n 'text-tf-muted interactive:hovered:bg-tf-panel-hi interactive:hovered:text-tf-fg',\n 'cursor-pointer tf-transition motion-reduce:transition-none',\n HIT_AREA,\n ...controlReach,\n ...controlPress,\n ...CLOSE_HELD,\n])\n\nexport {\n type ChipAccent,\n type ChipSize,\n type ChipTone,\n chipAccents,\n chipCloseRecipe,\n chipCountRecipe,\n chipDotRecipe,\n chipLabelRecipe,\n chipRecipe,\n chipSizes,\n chipTextRecipe,\n chipTones,\n defaultChipAccent,\n defaultChipSize,\n defaultChipTone,\n}\n"],"mappings":";;;AAUA,MAAM,kBAAkB;AAExB,MAAM,kBAAkB;AAExB,MAAM,oBAAoB;AAE1B,MAAM,YAAY;CAAC;CAAS;CAAW;AAAM;AAE7C,MAAM,YAAY,CAAC,MAAM,IAAI;AAE7B,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,WAAW,QAAQ,mBAAmB;AAE5C,MAAM,OAAO;CACX,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;AACX;AAEA,MAAM,UAAU;CACd,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;AACX;AAEA,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,MAAM,aAAa,IACjB;CACE;CACA;CACA;CACA;CACA;AACF,GACA;CACE,kBAAkB,CAChB,GAAG,YAAY,KAAK,YAAY;EAAE;EAAQ,OAAO,KAAK;EAAS,MAAM;CAAgB,EAAE,GACvF,GAAG,YAAY,KAAK,YAAY;EAC9B;EACA,OAAO,QAAQ;EACf,MAAM;CACR,EAAE,CACJ;CACA,iBAAiB;EACf,QAAQ;EACR,WAAW;EACX,MAAA;EACA,MAAM;CACR;CACA,UAAU;EACR,QAAQ;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;GACT,SAAS;EACX;EACA,WAAW;GAAE,OAAO;GAAI,MAAM;EAAO;EACrC,MAAM;GACJ,IAAI;GACJ,IAAI;EACN;EACA,MAAM;GACJ,SAAS;GACT,OAAO;GACP,MAAM;EACR;CACF;AACF,CACF;AAEA,MAAM,gBAAgB,IAAI,oCAAoC;CAC5D,iBAAiB,EAAE,QAAQ,kBAAkB;CAC7C,UAAU,EACR,QAAQ;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,SAAS;EACT,SAAS;EACT,SAAS;CACX,EACF;AACF,CAAC;AAED,MAAM,iBAAiB,IAAI,2CAA2C;AAEtE,MAAM,kBAAkB,IAAI,kBAAkB;AAE9C,MAAM,kBAAkB,IAAI,mEAAmE;AAE/F,MAAM,aAAa;CACjB;CACA;CACA;AACF;AAEA,MAAM,kBAAkB,IAAI;CAC1B;CACA;CACA;CACA;CACA;CACA,GAAG;CACH,GAAG;CACH,GAAG;AACL,CAAC"}
@@ -0,0 +1,74 @@
1
+ //#region src/recipes/codeEditor.d.ts
2
+ declare const codeEditorRecipe: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
3
+ declare const codeEditorTheme: {
4
+ '&': {
5
+ backgroundColor: string;
6
+ color: string;
7
+ fontSize: string;
8
+ lineHeight: string;
9
+ maxHeight: string;
10
+ };
11
+ '&.cm-focused': {
12
+ outline: string;
13
+ };
14
+ '&:not(.cm-focused) .cm-activeLine': {
15
+ backgroundColor: string;
16
+ };
17
+ '&:not(.cm-focused) .cm-activeLineGutter': {
18
+ backgroundColor: string;
19
+ color: string;
20
+ };
21
+ '.cm-activeLine': {
22
+ backgroundColor: string;
23
+ };
24
+ '.cm-activeLineGutter': {
25
+ backgroundColor: string;
26
+ color: string;
27
+ };
28
+ '.cm-content': {
29
+ caretColor: string;
30
+ fontFamily: string;
31
+ padding: string;
32
+ };
33
+ '.cm-cursor': {
34
+ borderLeftColor: string;
35
+ };
36
+ '.cm-gutters': {
37
+ backgroundColor: string;
38
+ border: string;
39
+ color: string;
40
+ fontFamily: string;
41
+ paddingLeft: string;
42
+ };
43
+ '.cm-line': {
44
+ padding: string;
45
+ transition: string;
46
+ };
47
+ '.cm-lineNumbers .cm-gutterElement': {
48
+ minWidth: string;
49
+ };
50
+ '.cm-placeholder': {
51
+ color: string;
52
+ };
53
+ '.cm-scroller': {
54
+ fontFamily: string;
55
+ lineHeight: string;
56
+ overflow: string;
57
+ padding: string;
58
+ scrollbarColor: string;
59
+ scrollbarWidth: string;
60
+ };
61
+ '.cm-selectionBackground': {
62
+ backgroundColor: string;
63
+ };
64
+ };
65
+ declare const codeSyntaxColors: {
66
+ key: string;
67
+ literal: string;
68
+ number: string;
69
+ punctuation: string;
70
+ text: string;
71
+ };
72
+ //#endregion
73
+ export { codeEditorRecipe, codeEditorTheme, codeSyntaxColors };
74
+ //# sourceMappingURL=codeEditor.d.ts.map