@igne-agency/react-web-ui 0.3.1 → 0.5.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 (291) hide show
  1. package/README.md +32 -1
  2. package/dist/base.css +3 -0
  3. package/dist/components/accordion/accordion.css +24 -19
  4. package/dist/components/accordion/accordion.d.ts +19 -3
  5. package/dist/components/accordion/accordion.js +86 -32
  6. package/dist/components/accordion/accordion.module.js +8 -8
  7. package/dist/components/active-filters/active-filter-describers.d.ts +1 -1
  8. package/dist/components/active-filters/active-filter-describers.js +1 -1
  9. package/dist/components/active-filters/active-filters.d.ts +35 -2
  10. package/dist/components/active-filters/active-filters.js +57 -52
  11. package/dist/components/active-filters/index.js +2 -2
  12. package/dist/components/attachment-tile/attachment-preview.d.ts +11 -9
  13. package/dist/components/attachment-tile/attachment-preview.js +102 -68
  14. package/dist/components/attachment-tile/attachment-tile.css +22 -13
  15. package/dist/components/attachment-tile/attachment-tile.d.ts +51 -6
  16. package/dist/components/attachment-tile/attachment-tile.js +209 -85
  17. package/dist/components/attachment-tile/attachment-tile.module.js +10 -10
  18. package/dist/components/attachment-tile/index.d.ts +1 -1
  19. package/dist/components/attachment-tile/index.js +2 -2
  20. package/dist/components/avatar/avatar.d.ts +5 -5
  21. package/dist/components/avatar/avatar.js +64 -37
  22. package/dist/components/avatar-group/avatar-group.js +2 -2
  23. package/dist/components/badge/badge.js +1 -1
  24. package/dist/components/breadcrumbs/breadcrumbs.d.ts +22 -7
  25. package/dist/components/breadcrumbs/breadcrumbs.js +189 -170
  26. package/dist/components/button/button.d.ts +2 -3
  27. package/dist/components/button/button.js +58 -77
  28. package/dist/components/button/close-button.d.ts +4 -2
  29. package/dist/components/button/close-button.js +9 -9
  30. package/dist/components/checkbox-field/checkbox-field.d.ts +17 -3
  31. package/dist/components/checkbox-field/checkbox-field.js +108 -131
  32. package/dist/components/checkbox-field/checkbox.css +26 -34
  33. package/dist/components/checkbox-field/checkbox.d.ts +51 -8
  34. package/dist/components/checkbox-field/checkbox.js +221 -57
  35. package/dist/components/checkbox-field/checkbox.module.js +6 -8
  36. package/dist/components/checkbox-field/index.d.ts +0 -1
  37. package/dist/components/checkbox-field/index.js +1 -2
  38. package/dist/components/checkbox-field/tsf-checkbox-field.d.ts +2 -2
  39. package/dist/components/checkbox-group-field/checkbox-group-field.d.ts +4 -1
  40. package/dist/components/checkbox-group-field/checkbox-group-field.js +54 -50
  41. package/dist/components/checkbox-group-field/checkbox-group.d.ts +7 -2
  42. package/dist/components/checkbox-group-field/checkbox-group.js +8 -3
  43. package/dist/components/collapsible/collapsible.css +23 -18
  44. package/dist/components/collapsible/collapsible.d.ts +18 -3
  45. package/dist/components/collapsible/collapsible.js +85 -32
  46. package/dist/components/collapsible/collapsible.module.js +7 -7
  47. package/dist/components/combobox-field/combobox-field.d.ts +9 -1
  48. package/dist/components/combobox-field/combobox-field.js +195 -175
  49. package/dist/components/combobox-field/combobox-items.d.ts +2 -2
  50. package/dist/components/combobox-field/combobox-items.js +4 -4
  51. package/dist/components/combobox-field/combobox.css +99 -96
  52. package/dist/components/combobox-field/combobox.d.ts +94 -15
  53. package/dist/components/combobox-field/combobox.js +484 -159
  54. package/dist/components/combobox-field/combobox.module.js +21 -21
  55. package/dist/components/combobox-field/index.d.ts +0 -1
  56. package/dist/components/combobox-field/selection.d.ts +4 -1
  57. package/dist/components/combobox-field/value-state-view.css +7 -3
  58. package/dist/components/combobox-field/value-state-view.d.ts +4 -2
  59. package/dist/components/combobox-field/value-state-view.js +15 -15
  60. package/dist/components/combobox-field/value-state-view.module.js +6 -4
  61. package/dist/components/composer/composer-attachments.d.ts +11 -3
  62. package/dist/components/composer/composer-attachments.js +61 -47
  63. package/dist/components/composer/composer-editor.d.ts +2 -1
  64. package/dist/components/composer/composer-editor.js +79 -71
  65. package/dist/components/composer/composer-mentions.js +2 -2
  66. package/dist/components/composer/composer.d.ts +42 -21
  67. package/dist/components/composer/composer.js +201 -58
  68. package/dist/components/composer/mention-text.js +3 -3
  69. package/dist/components/confirm-dialog/confirm-dialog.d.ts +8 -7
  70. package/dist/components/confirm-dialog/confirm-dialog.js +10 -9
  71. package/dist/components/conversation/conversation.context.d.ts +0 -5
  72. package/dist/components/conversation/conversation.d.ts +63 -29
  73. package/dist/components/conversation/conversation.js +193 -82
  74. package/dist/components/conversation/index.d.ts +1 -1
  75. package/dist/components/date-field/date-field.d.ts +10 -4
  76. package/dist/components/date-field/date-field.js +57 -43
  77. package/dist/components/date-field/date-input.d.ts +20 -3
  78. package/dist/components/date-field/date-input.js +28 -13
  79. package/dist/components/date-field/index.d.ts +1 -1
  80. package/dist/components/date-field/tsf-date-field.d.ts +1 -1
  81. package/dist/components/date-field/tsf-date-field.js +1 -1
  82. package/dist/components/date-range-field/date-range-field.d.ts +8 -4
  83. package/dist/components/date-range-field/date-range-field.js +57 -45
  84. package/dist/components/date-range-field/date-range-input.d.ts +20 -3
  85. package/dist/components/date-range-field/date-range-input.js +27 -12
  86. package/dist/components/date-range-field/tsf-date-range-field.d.ts +1 -1
  87. package/dist/components/date-range-field/tsf-date-range-field.js +1 -1
  88. package/dist/components/detail-list/detail-list.d.ts +28 -27
  89. package/dist/components/detail-list/detail-list.js +177 -121
  90. package/dist/components/dialog/dialog.d.ts +47 -27
  91. package/dist/components/dialog/dialog.js +101 -38
  92. package/dist/components/divider/divider.js +1 -1
  93. package/dist/components/drawer/drawer.d.ts +48 -30
  94. package/dist/components/drawer/drawer.js +113 -41
  95. package/dist/components/email-field/email-field.d.ts +5 -3
  96. package/dist/components/email-field/email-field.js +1 -3
  97. package/dist/components/email-field/tsf-email-field.d.ts +3 -2
  98. package/dist/components/empty-message/empty-message.d.ts +3 -3
  99. package/dist/components/empty-message/empty-message.js +3 -3
  100. package/dist/components/error-boundary/error-boundary.d.ts +5 -2
  101. package/dist/components/error-boundary/error-boundary.js +2 -3
  102. package/dist/components/error-message/error-message.d.ts +1 -1
  103. package/dist/components/error-message/error-message.js +1 -1
  104. package/dist/components/error-text/error-text.js +3 -3
  105. package/dist/components/field/field.d.ts +5 -5
  106. package/dist/components/field/field.js +9 -9
  107. package/dist/components/field/index.js +2 -2
  108. package/dist/components/field/input-parts.js +1 -1
  109. package/dist/components/field-placeholder/field-placeholder.d.ts +4 -1
  110. package/dist/components/field-placeholder/field-placeholder.js +41 -26
  111. package/dist/components/fieldset/field-group.js +1 -1
  112. package/dist/components/fieldset/fieldset-root.js +1 -1
  113. package/dist/components/fieldset/fieldset.js +1 -1
  114. package/dist/components/file-field/file-field.css +19 -15
  115. package/dist/components/file-field/file-field.d.ts +10 -1
  116. package/dist/components/file-field/file-field.js +130 -109
  117. package/dist/components/file-field/file-field.module.js +6 -4
  118. package/dist/components/file-field/file-input.d.ts +32 -9
  119. package/dist/components/file-field/file-input.js +94 -74
  120. package/dist/components/filter-bar/filter-bar.d.ts +79 -51
  121. package/dist/components/filter-bar/filter-bar.js +552 -216
  122. package/dist/components/form/form.d.ts +4 -6
  123. package/dist/components/form/form.js +6 -8
  124. package/dist/components/icon/icon.d.ts +5 -10
  125. package/dist/components/icon/icon.js +4 -6
  126. package/dist/components/link/link.js +1 -1
  127. package/dist/components/link-button/link-button.d.ts +1 -2
  128. package/dist/components/link-button/link-button.js +12 -22
  129. package/dist/components/loading-message/loading-message.d.ts +2 -2
  130. package/dist/components/loading-message/loading-message.js +1 -1
  131. package/dist/components/locale-provider/locale-provider.js +1 -1
  132. package/dist/components/menu/menu.d.ts +40 -22
  133. package/dist/components/menu/menu.js +100 -40
  134. package/dist/components/nav/nav-context.d.ts +0 -1
  135. package/dist/components/nav/nav-context.js +1 -2
  136. package/dist/components/nav/nav-item-view.d.ts +7 -7
  137. package/dist/components/nav/nav-item-view.js +27 -51
  138. package/dist/components/nav/nav.css +72 -60
  139. package/dist/components/nav/nav.d.ts +15 -8
  140. package/dist/components/nav/nav.js +105 -52
  141. package/dist/components/nav/nav.module.js +14 -14
  142. package/dist/components/number-field/number-field.d.ts +7 -1
  143. package/dist/components/number-field/number-field.js +98 -82
  144. package/dist/components/number-field/number-input.d.ts +53 -4
  145. package/dist/components/number-field/number-input.js +68 -21
  146. package/dist/components/number-field/tsf-number-field.d.ts +1 -1
  147. package/dist/components/number-field/tsf-number-field.js +1 -1
  148. package/dist/components/otp-field/otp-input.d.ts +25 -0
  149. package/dist/components/otp-field/otp-input.js +26 -1
  150. package/dist/components/pagination/pagination.d.ts +82 -23
  151. package/dist/components/pagination/pagination.js +656 -229
  152. package/dist/components/password-field/password-field.d.ts +7 -1
  153. package/dist/components/password-field/password-field.js +117 -126
  154. package/dist/components/password-field/password-strength.js +1 -1
  155. package/dist/components/password-field/tsf-password-field.d.ts +1 -1
  156. package/dist/components/password-field/tsf-password-field.js +1 -1
  157. package/dist/components/photo-field/photo-field.d.ts +17 -3
  158. package/dist/components/photo-field/photo-field.js +168 -89
  159. package/dist/components/photo-field/photo-input-context.d.ts +25 -0
  160. package/dist/components/photo-field/photo-input-context.js +14 -0
  161. package/dist/components/photo-field/photo-input.d.ts +58 -23
  162. package/dist/components/photo-field/photo-input.js +459 -261
  163. package/dist/components/popover/popover.d.ts +55 -23
  164. package/dist/components/popover/popover.js +205 -61
  165. package/dist/components/radio-group-field/radio-group.js +1 -1
  166. package/dist/components/search-field/search-field.d.ts +7 -5
  167. package/dist/components/search-field/search-field.js +4 -6
  168. package/dist/components/search-field/tsf-search-field.d.ts +1 -1
  169. package/dist/components/search-field/tsf-search-field.js +1 -1
  170. package/dist/components/segmented-control-field/segmented-control.js +1 -1
  171. package/dist/components/select-field/select-field.d.ts +7 -1
  172. package/dist/components/select-field/select-field.js +151 -139
  173. package/dist/components/select-field/select.d.ts +28 -6
  174. package/dist/components/select-field/select.js +234 -149
  175. package/dist/components/skeleton/skeleton.js +1 -1
  176. package/dist/components/spinner/spinner.css +47 -1
  177. package/dist/components/spinner/spinner.js +28 -11
  178. package/dist/components/spinner/spinner.module.js +18 -3
  179. package/dist/components/stale/stale.d.ts +17 -21
  180. package/dist/components/stale/stale.js +307 -129
  181. package/dist/components/status-message/status-message.css +22 -21
  182. package/dist/components/status-message/status-message.d.ts +10 -5
  183. package/dist/components/status-message/status-message.js +20 -24
  184. package/dist/components/status-message/status-message.module.js +6 -6
  185. package/dist/components/status-message/status-preset.d.ts +4 -5
  186. package/dist/components/status-message/status-preset.js +3 -3
  187. package/dist/components/switch-field/switch.js +1 -1
  188. package/dist/components/tabs/tabs.d.ts +51 -28
  189. package/dist/components/tabs/tabs.js +219 -144
  190. package/dist/components/tag/tag.css +23 -21
  191. package/dist/components/tag/tag.d.ts +17 -15
  192. package/dist/components/tag/tag.js +140 -65
  193. package/dist/components/tag/tag.module.js +3 -3
  194. package/dist/components/tag-group/tag-group.css +30 -27
  195. package/dist/components/tag-group/tag-group.d.ts +10 -4
  196. package/dist/components/tag-group/tag-group.js +47 -35
  197. package/dist/components/tag-group/tag-group.module.js +4 -4
  198. package/dist/components/text-field/text-field.d.ts +14 -3
  199. package/dist/components/text-field/text-field.js +154 -133
  200. package/dist/components/text-field/text-input.d.ts +89 -3
  201. package/dist/components/text-field/text-input.js +184 -70
  202. package/dist/components/textarea-field/textarea.js +1 -1
  203. package/dist/components/time-field/time-input.d.ts +6 -0
  204. package/dist/components/time-field/time-input.js +6 -0
  205. package/dist/components/time-zone-provider/time-zone-provider.js +1 -1
  206. package/dist/components/toast/index.js +2 -2
  207. package/dist/components/toast/toast-provider.css +38 -34
  208. package/dist/components/toast/toast-provider.d.ts +65 -3
  209. package/dist/components/toast/toast-provider.js +313 -148
  210. package/dist/components/toast/toast-provider.module.js +11 -17
  211. package/dist/components/toast/toast.d.ts +5 -1
  212. package/dist/components/toast/toast.js +2 -1
  213. package/dist/components/toggle-group-field/toggle-group.js +1 -1
  214. package/dist/components/tooltip/tooltip.d.ts +6 -6
  215. package/dist/components/tooltip/tooltip.js +7 -7
  216. package/dist/data-table/data-table-content.d.ts +18 -10
  217. package/dist/data-table/data-table-content.js +145 -290
  218. package/dist/data-table/data-table-context.d.ts +4 -2
  219. package/dist/data-table/data-table-context.js +1 -1
  220. package/dist/data-table/data-table-parts.d.ts +99 -0
  221. package/dist/data-table/data-table-parts.js +1182 -0
  222. package/dist/data-table/data-table-selection.d.ts +7 -3
  223. package/dist/data-table/data-table-selection.js +62 -37
  224. package/dist/data-table/data-table.css +100 -95
  225. package/dist/data-table/data-table.d.ts +49 -25
  226. package/dist/data-table/data-table.js +95 -83
  227. package/dist/data-table/data-table.module.js +34 -34
  228. package/dist/data-table/index.d.ts +2 -1
  229. package/dist/data-table/index.js +2 -1
  230. package/dist/data-view/use-data-view.d.ts +2 -2
  231. package/dist/data-view/use-data-view.js +2 -2
  232. package/dist/index.js +7 -8
  233. package/dist/lib/calendar/calendar-navigation.d.ts +9 -2
  234. package/dist/lib/calendar/calendar-navigation.js +72 -73
  235. package/dist/lib/calendar/calendar-year.d.ts +4 -3
  236. package/dist/lib/calendar/calendar-year.js +137 -156
  237. package/dist/lib/calendar/temporal.d.ts +18 -12
  238. package/dist/lib/calendar/temporal.js +191 -147
  239. package/dist/lib/table-storage.d.ts +2 -2
  240. package/dist/lib/table-storage.js +2 -2
  241. package/dist/lib/unsaved-changes/leave-guard.js +1 -1
  242. package/dist/terrazzo/index.d.ts +20 -3
  243. package/dist/terrazzo/index.js +110 -7
  244. package/dist/tokens.css +94 -71
  245. package/package.json +4 -3
  246. package/tokens/ref.tokens.json +0 -30
  247. package/tokens/sys.tokens.json +0 -7
  248. package/dist/assets/spinner.js +0 -28
  249. package/dist/components/checkbox-field/checkbox-glyph.d.ts +0 -12
  250. package/dist/components/checkbox-field/checkbox-glyph.js +0 -38
  251. package/dist/components/combobox-field/combobox-popup-body.d.ts +0 -34
  252. package/dist/components/combobox-field/combobox-popup-body.js +0 -142
  253. package/dist/components/conversation/conversation.context.js +0 -4
  254. package/dist/vendor/@material-design-icons/svg/outlined/add.js +0 -12
  255. package/dist/vendor/@material-design-icons/svg/outlined/arrow_downward.js +0 -12
  256. package/dist/vendor/@material-design-icons/svg/outlined/arrow_forward.js +0 -12
  257. package/dist/vendor/@material-design-icons/svg/outlined/arrow_upward.js +0 -12
  258. package/dist/vendor/@material-design-icons/svg/outlined/attach_file.js +0 -12
  259. package/dist/vendor/@material-design-icons/svg/outlined/block.js +0 -12
  260. package/dist/vendor/@material-design-icons/svg/outlined/calendar_today.js +0 -12
  261. package/dist/vendor/@material-design-icons/svg/outlined/check.js +0 -12
  262. package/dist/vendor/@material-design-icons/svg/outlined/check_circle.js +0 -12
  263. package/dist/vendor/@material-design-icons/svg/outlined/chevron_left.js +0 -12
  264. package/dist/vendor/@material-design-icons/svg/outlined/chevron_right.js +0 -12
  265. package/dist/vendor/@material-design-icons/svg/outlined/close.js +0 -12
  266. package/dist/vendor/@material-design-icons/svg/outlined/content_copy.js +0 -12
  267. package/dist/vendor/@material-design-icons/svg/outlined/date_range.js +0 -12
  268. package/dist/vendor/@material-design-icons/svg/outlined/description.js +0 -12
  269. package/dist/vendor/@material-design-icons/svg/outlined/download.js +0 -12
  270. package/dist/vendor/@material-design-icons/svg/outlined/error.js +0 -12
  271. package/dist/vendor/@material-design-icons/svg/outlined/error_outline.js +0 -12
  272. package/dist/vendor/@material-design-icons/svg/outlined/expand_less.js +0 -12
  273. package/dist/vendor/@material-design-icons/svg/outlined/expand_more.js +0 -12
  274. package/dist/vendor/@material-design-icons/svg/outlined/filter_alt.js +0 -12
  275. package/dist/vendor/@material-design-icons/svg/outlined/filter_alt_off.js +0 -12
  276. package/dist/vendor/@material-design-icons/svg/outlined/first_page.js +0 -12
  277. package/dist/vendor/@material-design-icons/svg/outlined/info.js +0 -12
  278. package/dist/vendor/@material-design-icons/svg/outlined/keyboard_arrow_down.js +0 -12
  279. package/dist/vendor/@material-design-icons/svg/outlined/last_page.js +0 -12
  280. package/dist/vendor/@material-design-icons/svg/outlined/mail.js +0 -12
  281. package/dist/vendor/@material-design-icons/svg/outlined/more_horiz.js +0 -12
  282. package/dist/vendor/@material-design-icons/svg/outlined/photo_camera.js +0 -12
  283. package/dist/vendor/@material-design-icons/svg/outlined/remove.js +0 -12
  284. package/dist/vendor/@material-design-icons/svg/outlined/restart_alt.js +0 -12
  285. package/dist/vendor/@material-design-icons/svg/outlined/restore.js +0 -12
  286. package/dist/vendor/@material-design-icons/svg/outlined/search.js +0 -12
  287. package/dist/vendor/@material-design-icons/svg/outlined/unfold_more.js +0 -12
  288. package/dist/vendor/@material-design-icons/svg/outlined/upload_file.js +0 -12
  289. package/dist/vendor/@material-design-icons/svg/outlined/visibility.js +0 -12
  290. package/dist/vendor/@material-design-icons/svg/outlined/visibility_off.js +0 -12
  291. package/dist/vendor/@material-design-icons/svg/outlined/warning_amber.js +0 -12
@@ -15,15 +15,32 @@ export type KitTokensOptions = Readonly<{
15
15
  * variableNameOf("sys.color.primary"); // "--sys-color-primary"
16
16
  */
17
17
  export declare const variableNameOf: (id: string) => string;
18
+ /**
19
+ * The custom property a typography token takes its family from:
20
+ * `--sys-font-family-heading` for a heading, `--sys-font-family-body` for
21
+ * everything else.
22
+ *
23
+ * @example
24
+ * fontFamilyPropertyOf("sys.font.heading.large"); // "--sys-font-family-heading"
25
+ */
26
+ export declare const fontFamilyPropertyOf: (id: string) => string;
18
27
  /**
19
28
  * A Terrazzo plugin that builds a resolver's tokens into the custom properties
20
- * the kit's components read: `--ref-*` and `--sys-*`, the `light` theme on
21
- * `:root` and the `dark` theme's `sys` roles on `html[data-theme="dark"]`, and
22
- * under `prefers-color-scheme: dark` unless `data-theme="light"`, all in the
29
+ * the kit's components read: the `ref` ramps on `:root`, the `light` theme's
30
+ * `sys` roles on `:root` and any `[data-theme="light"]` element, and the `dark`
31
+ * theme's on any `[data-theme="dark"]` element and on `<html>` under
32
+ * `prefers-color-scheme: dark` unless `data-theme="light"`, all in the
23
33
  * `kit.base` cascade layer after the kit's layer order. A shadow
24
34
  * tagged `$extensions["nl.igne.css"].property: "filter"` is written as
25
35
  * `drop-shadow()` filters.
26
36
  *
37
+ * Typography tokens name no family. A heading role's `font` takes
38
+ * `--sys-font-family-heading` and every other role `--sys-font-family-body`,
39
+ * which defaults to the system stack; the heading family follows the body
40
+ * family unless set. The plugin narrows Terrazzo's `core/valid-typography` rule
41
+ * to `fontSize`, `fontWeight` and `lineHeight` unless the config sets that
42
+ * rule's `requiredProperties` itself.
43
+ *
27
44
  * @example
28
45
  * // terrazzo.config.ts
29
46
  * import { defineConfig } from "@terrazzo/cli";
@@ -1,4 +1,16 @@
1
1
  import css, {} from "@terrazzo/plugin-css";
2
+ /**
3
+ * The typography properties the kit's tokens set. `fontFamily` is left out:
4
+ * every role takes its family from a custom property the app sets.
5
+ */
6
+ const TYPOGRAPHY_PROPERTIES = [
7
+ "fontSize",
8
+ "fontWeight",
9
+ "lineHeight",
10
+ ];
11
+ const VALID_TYPOGRAPHY = "core/valid-typography";
12
+ const BODY_FAMILY = "--sys-font-family-body";
13
+ const HEADING_FAMILY = "--sys-font-family-heading";
2
14
  const isRecord = (value) => typeof value === "object" && value !== null;
3
15
  const drawnAsFilter = (extensions) => {
4
16
  if (!isRecord(extensions)) {
@@ -20,6 +32,74 @@ export const variableNameOf = (id) => `--${id
20
32
  .replaceAll(".", "-")
21
33
  .replace(/(\p{Uppercase_Letter})(\p{Uppercase_Letter}*)/gu, (_, first, rest) => `-${first.toLocaleLowerCase()}${rest}`)}`;
22
34
  const variableName = (token) => variableNameOf(token.id);
35
+ /**
36
+ * The custom property a typography token takes its family from:
37
+ * `--sys-font-family-heading` for a heading, `--sys-font-family-body` for
38
+ * everything else.
39
+ *
40
+ * @example
41
+ * fontFamilyPropertyOf("sys.font.heading.large"); // "--sys-font-family-heading"
42
+ */
43
+ export const fontFamilyPropertyOf = (id) => id.split(".").includes("heading")
44
+ ? HEADING_FAMILY
45
+ : BODY_FAMILY;
46
+ const families = `\t${BODY_FAMILY}: system-ui, sans-serif;\n\t${HEADING_FAMILY}: var(${BODY_FAMILY});\n`;
47
+ const literal = (value) => isRecord(value) && "value" in value && "unit" in value
48
+ ? `${String(value["value"])}${String(value["unit"])}`
49
+ : String(value);
50
+ const typography = (token, { tokensSet }) => {
51
+ if (token.$type !== "typography") {
52
+ return undefined;
53
+ }
54
+ const alias = token.aliasChain?.[0];
55
+ const partials = token.partialAliasOf;
56
+ const subValue = (property, value) => {
57
+ const partial = isRecord(partials)
58
+ ? partials[property]
59
+ : undefined;
60
+ if (alias !== undefined) {
61
+ return `var(${variableNameOf(`${alias}-${property}`)})`;
62
+ }
63
+ if (typeof partial === "string") {
64
+ return tokensSet[partial]?.$type === "typography"
65
+ ? `var(${variableNameOf(`${partial}-${property}`)})`
66
+ : `var(${variableNameOf(partial)})`;
67
+ }
68
+ return literal(value);
69
+ };
70
+ return Object.fromEntries([
71
+ [
72
+ "font-family",
73
+ `var(${fontFamilyPropertyOf(token.id)})`,
74
+ ],
75
+ ...Object.entries(token.$value).flatMap(([property, value]) => property === "fontFamily"
76
+ ? []
77
+ : [
78
+ [
79
+ variableNameOf(property).slice(2),
80
+ subValue(property, value),
81
+ ],
82
+ ]),
83
+ ]);
84
+ };
85
+ /** Narrows the recommended typography rule to the properties a kit token sets, unless the project chose its own list. */
86
+ const narrowTypographyRule = (config) => {
87
+ const rule = config.lint.rules[VALID_TYPOGRAPHY];
88
+ if (rule === undefined) {
89
+ return;
90
+ }
91
+ const [severity, options] = rule;
92
+ const set = isRecord(options) ? options : {};
93
+ if (!("requiredProperties" in set)) {
94
+ config.lint.rules[VALID_TYPOGRAPHY] = [
95
+ severity,
96
+ {
97
+ ...set,
98
+ requiredProperties: [...TYPOGRAPHY_PROPERTIES],
99
+ },
100
+ ];
101
+ }
102
+ };
23
103
  const dropShadows = (token, { tokensSet, transformAlias }) => {
24
104
  if (token.$type !== "shadow" ||
25
105
  !drawnAsFilter(token.$extensions)) {
@@ -40,19 +120,28 @@ const dropShadows = (token, { tokensSet, transformAlias }) => {
40
120
  })
41
121
  .join(" ");
42
122
  };
43
- const light = (contents) => `:root {\n\tcolor-scheme: light;\n${contents}\n}`;
123
+ const ramps = (contents) => `:root {\n${families}${contents}\n}`;
124
+ const light = (contents) => `:root,\n[data-theme="light"] {\n\tcolor-scheme: light;\n${contents}\n}`;
44
125
  const LAYER_ORDER = "@layer kit.reset, kit.base, kit.components;";
45
126
  const layered = (contents) => `${LAYER_ORDER}\n\n@layer kit.base {\n${contents.trimEnd()}\n}\n`;
46
- const dark = (contents) => `html[data-theme="dark"] {\n\tcolor-scheme: dark;\n${contents}\n}\n\n@media (prefers-color-scheme: dark) {\n\thtml:not([data-theme="light"]) {\n\t\tcolor-scheme: dark;\n${contents}\n\t}\n}`;
127
+ const dark = (contents) => `[data-theme="dark"] {\n\tcolor-scheme: dark;\n${contents}\n}\n\n@media (prefers-color-scheme: dark) {\n\thtml:not([data-theme="light"]) {\n\t\tcolor-scheme: dark;\n${contents}\n\t}\n}`;
47
128
  /**
48
129
  * A Terrazzo plugin that builds a resolver's tokens into the custom properties
49
- * the kit's components read: `--ref-*` and `--sys-*`, the `light` theme on
50
- * `:root` and the `dark` theme's `sys` roles on `html[data-theme="dark"]`, and
51
- * under `prefers-color-scheme: dark` unless `data-theme="light"`, all in the
130
+ * the kit's components read: the `ref` ramps on `:root`, the `light` theme's
131
+ * `sys` roles on `:root` and any `[data-theme="light"]` element, and the `dark`
132
+ * theme's on any `[data-theme="dark"]` element and on `<html>` under
133
+ * `prefers-color-scheme: dark` unless `data-theme="light"`, all in the
52
134
  * `kit.base` cascade layer after the kit's layer order. A shadow
53
135
  * tagged `$extensions["nl.igne.css"].property: "filter"` is written as
54
136
  * `drop-shadow()` filters.
55
137
  *
138
+ * Typography tokens name no family. A heading role's `font` takes
139
+ * `--sys-font-family-heading` and every other role `--sys-font-family-body`,
140
+ * which defaults to the system stack; the heading family follows the body
141
+ * family unless set. The plugin narrows Terrazzo's `core/valid-typography` rule
142
+ * to `fontSize`, `fontWeight` and `lineHeight` unless the config sets that
143
+ * rule's `requiredProperties` itself.
144
+ *
56
145
  * @example
57
146
  * // terrazzo.config.ts
58
147
  * import { defineConfig } from "@terrazzo/cli";
@@ -68,9 +157,19 @@ const kitTokens = (options = {}) => {
68
157
  const plugin = css({
69
158
  filename: options.filename ?? "tokens.css",
70
159
  variableName,
71
- transform: dropShadows,
160
+ transform: (token, transformOptions) => typography(token, transformOptions) ??
161
+ dropShadows(token, transformOptions),
72
162
  permutations: [
73
- { input: { theme: "light" }, prepare: light },
163
+ {
164
+ input: { theme: "light" },
165
+ include: ["ref.**"],
166
+ prepare: ramps,
167
+ },
168
+ {
169
+ input: { theme: "light" },
170
+ include: ["sys.**"],
171
+ prepare: light,
172
+ },
74
173
  {
75
174
  input: { theme: "dark" },
76
175
  include: ["sys.**"],
@@ -80,6 +179,10 @@ const kitTokens = (options = {}) => {
80
179
  });
81
180
  return {
82
181
  ...plugin,
182
+ config: (config, context) => {
183
+ narrowTypographyRule(config);
184
+ return plugin.config?.(config, context);
185
+ },
83
186
  build: hook => plugin.build?.({
84
187
  ...hook,
85
188
  outputFile: (filename, contents) => {