nuxt-ui-tools 1.23.0 → 1.25.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 (226) hide show
  1. package/dist/module.d.mts +3 -0
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +8 -0
  4. package/dist/runtime/display/components/blocks/display-accordion.d.vue.ts +4 -0
  5. package/dist/runtime/display/components/blocks/display-accordion.vue +93 -0
  6. package/dist/runtime/display/components/blocks/display-accordion.vue.d.ts +4 -0
  7. package/dist/runtime/display/components/blocks/display-alert.d.vue.ts +4 -0
  8. package/dist/runtime/display/components/blocks/display-alert.vue +133 -0
  9. package/dist/runtime/display/components/blocks/display-alert.vue.d.ts +4 -0
  10. package/dist/runtime/display/components/blocks/display-breakdown.d.vue.ts +4 -0
  11. package/dist/runtime/display/components/blocks/display-breakdown.vue +178 -0
  12. package/dist/runtime/display/components/blocks/display-breakdown.vue.d.ts +4 -0
  13. package/dist/runtime/display/components/blocks/display-chart.d.vue.ts +4 -0
  14. package/dist/runtime/display/components/blocks/display-chart.vue +237 -0
  15. package/dist/runtime/display/components/blocks/display-chart.vue.d.ts +4 -0
  16. package/dist/runtime/display/components/blocks/display-code.d.vue.ts +4 -0
  17. package/dist/runtime/display/components/blocks/display-code.vue +143 -0
  18. package/dist/runtime/display/components/blocks/display-code.vue.d.ts +4 -0
  19. package/dist/runtime/display/components/blocks/display-date.d.vue.ts +4 -0
  20. package/dist/runtime/display/components/blocks/display-date.vue +174 -0
  21. package/dist/runtime/display/components/blocks/display-date.vue.d.ts +4 -0
  22. package/dist/runtime/display/components/blocks/display-diff.d.vue.ts +4 -0
  23. package/dist/runtime/display/components/blocks/display-diff.vue +142 -0
  24. package/dist/runtime/display/components/blocks/display-diff.vue.d.ts +4 -0
  25. package/dist/runtime/display/components/blocks/display-empty.d.vue.ts +4 -0
  26. package/dist/runtime/display/components/blocks/display-empty.vue +74 -0
  27. package/dist/runtime/display/components/blocks/display-empty.vue.d.ts +4 -0
  28. package/dist/runtime/display/components/blocks/display-facts.d.vue.ts +4 -0
  29. package/dist/runtime/display/components/blocks/display-facts.vue +180 -0
  30. package/dist/runtime/display/components/blocks/display-facts.vue.d.ts +4 -0
  31. package/dist/runtime/display/components/blocks/display-heading.d.vue.ts +4 -0
  32. package/dist/runtime/display/components/blocks/display-heading.vue +96 -0
  33. package/dist/runtime/display/components/blocks/display-heading.vue.d.ts +4 -0
  34. package/dist/runtime/display/components/blocks/display-list.d.vue.ts +4 -0
  35. package/dist/runtime/display/components/blocks/display-list.vue +295 -0
  36. package/dist/runtime/display/components/blocks/display-list.vue.d.ts +4 -0
  37. package/dist/runtime/display/components/blocks/display-media.d.vue.ts +4 -0
  38. package/dist/runtime/display/components/blocks/display-media.vue +326 -0
  39. package/dist/runtime/display/components/blocks/display-media.vue.d.ts +4 -0
  40. package/dist/runtime/display/components/blocks/display-meter.d.vue.ts +4 -0
  41. package/dist/runtime/display/components/blocks/display-meter.vue +301 -0
  42. package/dist/runtime/display/components/blocks/display-meter.vue.d.ts +4 -0
  43. package/dist/runtime/display/components/blocks/display-person.d.vue.ts +4 -0
  44. package/dist/runtime/display/components/blocks/display-person.vue +146 -0
  45. package/dist/runtime/display/components/blocks/display-person.vue.d.ts +4 -0
  46. package/dist/runtime/display/components/blocks/display-record.d.vue.ts +4 -0
  47. package/dist/runtime/display/components/blocks/display-record.vue +208 -0
  48. package/dist/runtime/display/components/blocks/display-record.vue.d.ts +4 -0
  49. package/dist/runtime/display/components/blocks/display-stat.d.vue.ts +4 -0
  50. package/dist/runtime/display/components/blocks/display-stat.vue +178 -0
  51. package/dist/runtime/display/components/blocks/display-stat.vue.d.ts +4 -0
  52. package/dist/runtime/display/components/blocks/display-table.d.vue.ts +4 -0
  53. package/dist/runtime/display/components/blocks/display-table.vue +132 -0
  54. package/dist/runtime/display/components/blocks/display-table.vue.d.ts +4 -0
  55. package/dist/runtime/display/components/blocks/display-text.d.vue.ts +4 -0
  56. package/dist/runtime/display/components/blocks/display-text.vue +135 -0
  57. package/dist/runtime/display/components/blocks/display-text.vue.d.ts +4 -0
  58. package/dist/runtime/display/components/blocks/display-timeline.d.vue.ts +4 -0
  59. package/dist/runtime/display/components/blocks/display-timeline.vue +232 -0
  60. package/dist/runtime/display/components/blocks/display-timeline.vue.d.ts +4 -0
  61. package/dist/runtime/display/components/display.d.vue.ts +24 -0
  62. package/dist/runtime/display/components/display.vue +21 -0
  63. package/dist/runtime/display/components/display.vue.d.ts +24 -0
  64. package/dist/runtime/display/components/parts/display-actions.d.vue.ts +9 -0
  65. package/dist/runtime/display/components/parts/display-actions.vue +24 -0
  66. package/dist/runtime/display/components/parts/display-actions.vue.d.ts +9 -0
  67. package/dist/runtime/display/components/parts/display-chip.d.vue.ts +11 -0
  68. package/dist/runtime/display/components/parts/display-chip.vue +45 -0
  69. package/dist/runtime/display/components/parts/display-chip.vue.d.ts +11 -0
  70. package/dist/runtime/display/components/parts/display-copy.d.vue.ts +6 -0
  71. package/dist/runtime/display/components/parts/display-copy.vue +27 -0
  72. package/dist/runtime/display/components/parts/display-copy.vue.d.ts +6 -0
  73. package/dist/runtime/display/components/parts/display-empty-line.d.vue.ts +7 -0
  74. package/dist/runtime/display/components/parts/display-empty-line.vue +21 -0
  75. package/dist/runtime/display/components/parts/display-empty-line.vue.d.ts +7 -0
  76. package/dist/runtime/display/components/parts/display-fact-value.d.vue.ts +7 -0
  77. package/dist/runtime/display/components/parts/display-fact-value.vue +35 -0
  78. package/dist/runtime/display/components/parts/display-fact-value.vue.d.ts +7 -0
  79. package/dist/runtime/display/components/parts/display-load-error.d.vue.ts +7 -0
  80. package/dist/runtime/display/components/parts/display-load-error.vue +29 -0
  81. package/dist/runtime/display/components/parts/display-load-error.vue.d.ts +7 -0
  82. package/dist/runtime/display/components/parts/display-more.d.vue.ts +10 -0
  83. package/dist/runtime/display/components/parts/display-more.vue +23 -0
  84. package/dist/runtime/display/components/parts/display-more.vue.d.ts +10 -0
  85. package/dist/runtime/display/components/parts/display-record-media.d.vue.ts +9 -0
  86. package/dist/runtime/display/components/parts/display-record-media.vue +59 -0
  87. package/dist/runtime/display/components/parts/display-record-media.vue.d.ts +9 -0
  88. package/dist/runtime/display/components/parts/display-render.d.ts +10 -0
  89. package/dist/runtime/display/components/parts/display-render.js +5 -0
  90. package/dist/runtime/display/components/parts/display-skeleton.d.vue.ts +7 -0
  91. package/dist/runtime/display/components/parts/display-skeleton.vue +67 -0
  92. package/dist/runtime/display/components/parts/display-skeleton.vue.d.ts +7 -0
  93. package/dist/runtime/display/composables/use-display-config.d.ts +6 -0
  94. package/dist/runtime/display/composables/use-display-config.js +11 -0
  95. package/dist/runtime/display/composables/use-display-file-preview.d.ts +9 -0
  96. package/dist/runtime/display/composables/use-display-file-preview.js +11 -0
  97. package/dist/runtime/display/composables/use-display-icons.d.ts +8 -0
  98. package/dist/runtime/display/composables/use-display-icons.js +62 -0
  99. package/dist/runtime/display/composables/use-display-locale.d.ts +5 -0
  100. package/dist/runtime/display/composables/use-display-locale.js +5 -0
  101. package/dist/runtime/display/composables/use-display-number.d.ts +2 -0
  102. package/dist/runtime/display/composables/use-display-number.js +7 -0
  103. package/dist/runtime/display/composables/use-display-reveal.d.ts +14 -0
  104. package/dist/runtime/display/composables/use-display-reveal.js +15 -0
  105. package/dist/runtime/display/composables/use-display-url.d.ts +26 -0
  106. package/dist/runtime/display/composables/use-display-url.js +46 -0
  107. package/dist/runtime/display/index.d.ts +4 -0
  108. package/dist/runtime/display/index.js +3 -0
  109. package/dist/runtime/display/plugins/display-tones.d.ts +3 -0
  110. package/dist/runtime/display/plugins/display-tones.js +17 -0
  111. package/dist/runtime/display/types/blocks/accordion.d.ts +18 -0
  112. package/dist/runtime/display/types/blocks/accordion.js +0 -0
  113. package/dist/runtime/display/types/blocks/alert.d.ts +31 -0
  114. package/dist/runtime/display/types/blocks/alert.js +0 -0
  115. package/dist/runtime/display/types/blocks/breakdown.d.ts +36 -0
  116. package/dist/runtime/display/types/blocks/breakdown.js +0 -0
  117. package/dist/runtime/display/types/blocks/chart.d.ts +23 -0
  118. package/dist/runtime/display/types/blocks/chart.js +0 -0
  119. package/dist/runtime/display/types/blocks/code.d.ts +21 -0
  120. package/dist/runtime/display/types/blocks/code.js +0 -0
  121. package/dist/runtime/display/types/blocks/date.d.ts +27 -0
  122. package/dist/runtime/display/types/blocks/date.js +0 -0
  123. package/dist/runtime/display/types/blocks/diff.d.ts +20 -0
  124. package/dist/runtime/display/types/blocks/diff.js +0 -0
  125. package/dist/runtime/display/types/blocks/empty.d.ts +13 -0
  126. package/dist/runtime/display/types/blocks/empty.js +0 -0
  127. package/dist/runtime/display/types/blocks/facts.d.ts +50 -0
  128. package/dist/runtime/display/types/blocks/facts.js +0 -0
  129. package/dist/runtime/display/types/blocks/heading.d.ts +19 -0
  130. package/dist/runtime/display/types/blocks/heading.js +0 -0
  131. package/dist/runtime/display/types/blocks/list.d.ts +36 -0
  132. package/dist/runtime/display/types/blocks/list.js +0 -0
  133. package/dist/runtime/display/types/blocks/media.d.ts +42 -0
  134. package/dist/runtime/display/types/blocks/media.js +0 -0
  135. package/dist/runtime/display/types/blocks/meter.d.ts +48 -0
  136. package/dist/runtime/display/types/blocks/meter.js +0 -0
  137. package/dist/runtime/display/types/blocks/person.d.ts +32 -0
  138. package/dist/runtime/display/types/blocks/person.js +0 -0
  139. package/dist/runtime/display/types/blocks/record.d.ts +42 -0
  140. package/dist/runtime/display/types/blocks/record.js +0 -0
  141. package/dist/runtime/display/types/blocks/stat.d.ts +44 -0
  142. package/dist/runtime/display/types/blocks/stat.js +0 -0
  143. package/dist/runtime/display/types/blocks/table.d.ts +28 -0
  144. package/dist/runtime/display/types/blocks/table.js +0 -0
  145. package/dist/runtime/display/types/blocks/text.d.ts +22 -0
  146. package/dist/runtime/display/types/blocks/text.js +0 -0
  147. package/dist/runtime/display/types/blocks/timeline.d.ts +37 -0
  148. package/dist/runtime/display/types/blocks/timeline.js +0 -0
  149. package/dist/runtime/display/types/config.d.ts +53 -0
  150. package/dist/runtime/display/types/config.js +0 -0
  151. package/dist/runtime/display/types/index.d.ts +22 -0
  152. package/dist/runtime/display/types/index.js +0 -0
  153. package/dist/runtime/display/types/registry.d.ts +57 -0
  154. package/dist/runtime/display/types/registry.js +0 -0
  155. package/dist/runtime/display/types/shared.d.ts +71 -0
  156. package/dist/runtime/display/types/shared.js +0 -0
  157. package/dist/runtime/display/utils/classes.d.ts +3 -0
  158. package/dist/runtime/display/utils/classes.js +7 -0
  159. package/dist/runtime/display/utils/config.d.ts +6 -0
  160. package/dist/runtime/display/utils/config.js +7 -0
  161. package/dist/runtime/display/utils/content.d.ts +7 -0
  162. package/dist/runtime/display/utils/content.js +13 -0
  163. package/dist/runtime/display/utils/dates.d.ts +16 -0
  164. package/dist/runtime/display/utils/dates.js +34 -0
  165. package/dist/runtime/display/utils/json.d.ts +7 -0
  166. package/dist/runtime/display/utils/json.js +15 -0
  167. package/dist/runtime/display/utils/meter.d.ts +7 -0
  168. package/dist/runtime/display/utils/meter.js +13 -0
  169. package/dist/runtime/display/utils/registry.d.ts +47 -0
  170. package/dist/runtime/display/utils/registry.js +64 -0
  171. package/dist/runtime/display/utils/tone-css.d.ts +7 -0
  172. package/dist/runtime/display/utils/tone-css.js +38 -0
  173. package/dist/runtime/display/utils/tone.d.ts +26 -0
  174. package/dist/runtime/display/utils/tone.js +38 -0
  175. package/dist/runtime/display/utils/urls.d.ts +10 -0
  176. package/dist/runtime/display/utils/urls.js +33 -0
  177. package/dist/runtime/file-preview/components/shell/file-preview-stage.vue +5 -3
  178. package/dist/runtime/file-preview/composables/use-file-preview-source.d.ts +7 -0
  179. package/dist/runtime/file-preview/composables/use-file-preview-source.js +7 -1
  180. package/dist/runtime/file-preview/index.d.ts +1 -0
  181. package/dist/runtime/file-preview/index.js +1 -0
  182. package/dist/runtime/file-preview/types/file.d.ts +9 -0
  183. package/dist/runtime/file-preview/utils/errors.d.ts +30 -0
  184. package/dist/runtime/file-preview/utils/errors.js +26 -0
  185. package/dist/runtime/form/components/utils/form-file-preview.vue +7 -2
  186. package/dist/runtime/form/composables/use-form-root.js +2 -0
  187. package/dist/runtime/form/composables/use-form-runtime.js +7 -2
  188. package/dist/runtime/form/fields/index.d.ts +5 -0
  189. package/dist/runtime/form/fields/info/component.vue +51 -19
  190. package/dist/runtime/form/fields/info/config.d.ts +5 -0
  191. package/dist/runtime/form/fields/info/config.js +2 -1
  192. package/dist/runtime/form/fields/info/types.d.ts +78 -4
  193. package/dist/runtime/form/fields/info/use-info-display.d.ts +20 -0
  194. package/dist/runtime/form/fields/info/use-info-display.js +82 -0
  195. package/dist/runtime/form/fields/upload/upload-item.vue +10 -2
  196. package/dist/runtime/form/types/api.d.ts +6 -0
  197. package/dist/runtime/form/types/runtime.d.ts +2 -0
  198. package/dist/runtime/form/utils/dynamic.d.ts +6 -0
  199. package/dist/runtime/form/utils/dynamic.js +7 -0
  200. package/dist/runtime/i18n/locales/en.js +32 -0
  201. package/dist/runtime/i18n/locales/fr.js +32 -0
  202. package/dist/runtime/i18n/types.d.ts +40 -0
  203. package/dist/runtime/shared/styles/tokens.css +1 -1
  204. package/dist/runtime/shared/utils/file.d.ts +1 -1
  205. package/dist/runtime/table/components/data-list/data-list-root.vue +2 -0
  206. package/dist/runtime/table/components/data-list/data-list-selection-actions.d.vue.ts +1 -1
  207. package/dist/runtime/table/components/data-list/data-list-selection-actions.vue +32 -5
  208. package/dist/runtime/table/components/data-list/data-list-selection-actions.vue.d.ts +1 -1
  209. package/dist/runtime/table/components/data-list/data-list-selection-sheet.d.vue.ts +10 -0
  210. package/dist/runtime/table/components/data-list/data-list-selection-sheet.vue +238 -0
  211. package/dist/runtime/table/components/data-list/data-list-selection-sheet.vue.d.ts +10 -0
  212. package/dist/runtime/table/components/grid/grid-renderer.vue +2 -0
  213. package/dist/runtime/table/components/summary/summary-renderer.vue +2 -0
  214. package/dist/runtime/table/components/table/table-renderer.vue +2 -0
  215. package/dist/runtime/table/components/utils/overlay-inset-spacer.d.vue.ts +3 -0
  216. package/dist/runtime/table/components/utils/overlay-inset-spacer.vue +13 -0
  217. package/dist/runtime/table/components/utils/overlay-inset-spacer.vue.d.ts +3 -0
  218. package/dist/runtime/table/composables/use-data-list-overlay-inset.d.ts +10 -0
  219. package/dist/runtime/table/composables/use-data-list-overlay-inset.js +11 -0
  220. package/dist/runtime/table/composables/use-table-actions.js +11 -2
  221. package/dist/runtime/table/constants/mobile.d.ts +0 -7
  222. package/dist/runtime/table/constants/mobile.js +0 -1
  223. package/dist/runtime/table/types/actions.d.ts +7 -0
  224. package/dist/runtime/table/types/data-list.d.ts +8 -1
  225. package/dist/runtime/table/utils/data-list-ui.d.ts +1 -1
  226. package/package.json +16 -1
@@ -0,0 +1,37 @@
1
+ import type { DisplayAvatar, DisplayBlockBase, DisplayContent, DisplayDate, DisplayRevealable, DisplayText, DisplayTone } from '../shared.js';
2
+ export type DisplayTimelineState = 'done' | 'current' | 'upcoming';
3
+ export type DisplayTimelineSlot = 'root' | 'item' | 'marker' | 'connector' | 'body' | 'title' | 'time' | 'description' | 'actor' | 'now' | 'more' | 'empty';
4
+ export interface DisplayTimelineItem {
5
+ title: DisplayContent;
6
+ description?: DisplayContent;
7
+ /** Orders `schedule` items against `now` and fills `time` when it is not set. */
8
+ date?: DisplayDate;
9
+ /** Text of the time, such as `12 oct.`. Defaults to the formatted `date`. */
10
+ time?: DisplayText;
11
+ icon?: string;
12
+ /** Defaults to `neutral`. */
13
+ tone?: DisplayTone;
14
+ actor?: {
15
+ name: DisplayText;
16
+ avatar?: DisplayAvatar;
17
+ };
18
+ /** Defaults from `date` against `now` when there is a date, `done` otherwise. */
19
+ state?: DisplayTimelineState;
20
+ }
21
+ export interface DisplayTimelineProps extends DisplayBlockBase<DisplayTimelineSlot>, DisplayRevealable {
22
+ /**
23
+ * `vertical` lists events with dots, `log` is a dense list with times and actors, `pipeline`
24
+ * draws stages in a row, and `schedule` lists planned events with a "today" marker.
25
+ * Defaults to `vertical`.
26
+ */
27
+ variant?: 'vertical' | 'log' | 'pipeline' | 'schedule';
28
+ items: readonly DisplayTimelineItem[];
29
+ /** `pipeline`: index of the current stage, for items without a `state`. */
30
+ current?: number;
31
+ /** Defaults to the current time. */
32
+ now?: DisplayDate;
33
+ /** `schedule` marker text. Defaults to "Today" and the date. */
34
+ nowLabel?: DisplayText;
35
+ /** Format of the times built from dates. Defaults to day and short month, plus the time in `log`. */
36
+ dateFormat?: Intl.DateTimeFormatOptions;
37
+ }
File without changes
@@ -0,0 +1,53 @@
1
+ import type { DisplayKind, DisplayPropsMap, DisplayUiMap } from './registry.js';
2
+ import type { DisplayBuiltinTone, DisplayToneRegistry } from './shared.js';
3
+ /**
4
+ * Colors of a tone, as CSS colors. Only `color` is needed for a new tone: the ink defaults to it,
5
+ * the soft background and the line mix it into the page background.
6
+ */
7
+ export interface DisplayToneColors {
8
+ /** Solid fill: bars, dots, current steps. */
9
+ color?: string;
10
+ /** Text and icons drawn on the page. */
11
+ ink?: string;
12
+ /** Tinted background. */
13
+ soft?: string;
14
+ /** Border. */
15
+ line?: string;
16
+ /** Text on the solid fill. */
17
+ contrast?: string;
18
+ }
19
+ /** A tone registered or restyled in `appConfig.nuxtUiTools.display.tones`. */
20
+ export interface DisplayToneDefinition extends DisplayToneColors {
21
+ /** Colors used in dark mode, over the light ones. */
22
+ dark?: DisplayToneColors;
23
+ }
24
+ /** Tones by name: new ones need `color`; a built-in tone takes only the colors it changes. */
25
+ export type DisplayToneDefinitions = Record<Extract<keyof DisplayToneRegistry, string>, DisplayToneDefinition & {
26
+ color: string;
27
+ }> & Partial<Record<DisplayBuiltinTone, DisplayToneDefinition>>;
28
+ /** Named default props per kind, picked with `preset`. */
29
+ export type DisplayPresets = {
30
+ [K in DisplayKind]?: Readonly<Record<string, Partial<DisplayPropsMap[K]>>>;
31
+ };
32
+ /**
33
+ * App-wide display defaults, from `appConfig.nuxtUiTools.display`.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * export default defineAppConfig({
38
+ * nuxtUiTools: {
39
+ * display: {
40
+ * presets: { text: { legal: { appearance: 'legal', icon: 'i-lucide-shield' } } },
41
+ * tones: { violet: { color: 'var(--color-violet-500)' }, primary: { ink: '#b85e00' } },
42
+ * ui: { facts: { label: 'text-muted', value: 'font-semibold' } },
43
+ * },
44
+ * },
45
+ * })
46
+ * ```
47
+ */
48
+ export interface DisplayUiConfig {
49
+ presets?: DisplayPresets;
50
+ /** Extra tones, and color changes to the built-in ones. Register new names in `DisplayToneRegistry`. */
51
+ tones?: Partial<DisplayToneDefinitions>;
52
+ ui?: Partial<DisplayUiMap>;
53
+ }
File without changes
@@ -0,0 +1,22 @@
1
+ export type * from './blocks/accordion';
2
+ export type * from './blocks/alert';
3
+ export type * from './blocks/breakdown';
4
+ export type * from './blocks/chart';
5
+ export type * from './blocks/code';
6
+ export type * from './blocks/date';
7
+ export type * from './blocks/diff';
8
+ export type * from './blocks/empty';
9
+ export type * from './blocks/facts';
10
+ export type * from './blocks/heading';
11
+ export type * from './blocks/list';
12
+ export type * from './blocks/media';
13
+ export type * from './blocks/meter';
14
+ export type * from './blocks/person';
15
+ export type * from './blocks/record';
16
+ export type * from './blocks/stat';
17
+ export type * from './blocks/table';
18
+ export type * from './blocks/text';
19
+ export type * from './blocks/timeline';
20
+ export type * from './config';
21
+ export type * from './registry';
22
+ export type * from './shared';
File without changes
@@ -0,0 +1,57 @@
1
+ import type { DisplayAccordionProps } from './blocks/accordion.js';
2
+ import type { DisplayAlertProps } from './blocks/alert.js';
3
+ import type { DisplayBreakdownProps } from './blocks/breakdown.js';
4
+ import type { DisplayChartProps } from './blocks/chart.js';
5
+ import type { DisplayCodeProps } from './blocks/code.js';
6
+ import type { DisplayDateProps } from './blocks/date.js';
7
+ import type { DisplayDiffProps } from './blocks/diff.js';
8
+ import type { DisplayEmptyProps } from './blocks/empty.js';
9
+ import type { DisplayFactsProps } from './blocks/facts.js';
10
+ import type { DisplayHeadingProps } from './blocks/heading.js';
11
+ import type { DisplayListProps } from './blocks/list.js';
12
+ import type { DisplayMediaProps } from './blocks/media.js';
13
+ import type { DisplayMeterProps } from './blocks/meter.js';
14
+ import type { DisplayPersonProps } from './blocks/person.js';
15
+ import type { DisplayRecordProps } from './blocks/record.js';
16
+ import type { DisplayStatProps } from './blocks/stat.js';
17
+ import type { DisplayTableProps } from './blocks/table.js';
18
+ import type { DisplayTextProps } from './blocks/text.js';
19
+ import type { DisplayTimelineProps } from './blocks/timeline.js';
20
+ /** Props of every display block, by kind. */
21
+ export interface DisplayPropsMap {
22
+ heading: DisplayHeadingProps;
23
+ text: DisplayTextProps;
24
+ alert: DisplayAlertProps;
25
+ facts: DisplayFactsProps;
26
+ stat: DisplayStatProps;
27
+ breakdown: DisplayBreakdownProps;
28
+ meter: DisplayMeterProps;
29
+ chart: DisplayChartProps;
30
+ table: DisplayTableProps;
31
+ diff: DisplayDiffProps;
32
+ record: DisplayRecordProps;
33
+ person: DisplayPersonProps;
34
+ list: DisplayListProps;
35
+ timeline: DisplayTimelineProps;
36
+ date: DisplayDateProps;
37
+ media: DisplayMediaProps;
38
+ code: DisplayCodeProps;
39
+ empty: DisplayEmptyProps;
40
+ accordion: DisplayAccordionProps;
41
+ }
42
+ export type DisplayKind = keyof DisplayPropsMap;
43
+ /** Slot classes of every display block, by kind. */
44
+ export type DisplayUiMap = {
45
+ [K in DisplayKind]: NonNullable<DisplayPropsMap[K]['ui']>;
46
+ };
47
+ /**
48
+ * One display block: its kind, its props, and optionally a preset from
49
+ * `appConfig.nuxtUiTools.display.presets` whose props the given ones override.
50
+ */
51
+ export type DisplaySpec = {
52
+ [K in DisplayKind]: {
53
+ display: K;
54
+ props: DisplayPropsMap[K];
55
+ preset?: string;
56
+ };
57
+ }[DisplayKind];
File without changes
@@ -0,0 +1,71 @@
1
+ import type { AvatarProps } from '@nuxt/ui/components/Avatar.vue';
2
+ import type { BadgeProps } from '@nuxt/ui/components/Badge.vue';
3
+ import type { ButtonProps } from '@nuxt/ui/components/Button.vue';
4
+ import type { LazyRenderableValue, LazyTextValue, MaybePromise } from '../../shared/types/utils.js';
5
+ /** Tones every app has: the Nuxt UI colors. */
6
+ export type DisplayBuiltinTone = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'error' | 'neutral';
7
+ /**
8
+ * Extra tones an app registers in `appConfig.nuxtUiTools.display.tones`. Augment it so those
9
+ * names type-check wherever a tone is accepted:
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * declare module '#ui-tools/display' {
14
+ * interface DisplayToneRegistry {
15
+ * violet: true
16
+ * teal: true
17
+ * }
18
+ * }
19
+ * ```
20
+ */
21
+ export interface DisplayToneRegistry {
22
+ }
23
+ /**
24
+ * Color role of a block or one of its parts: a built-in tone or a registered one. Each tone reads
25
+ * the `--nut-display-<tone>`, `-ink`, `-soft`, `-line` and `-contrast` variables, so an app
26
+ * restyles a tone in CSS.
27
+ */
28
+ export type DisplayTone = DisplayBuiltinTone | Extract<keyof DisplayToneRegistry, string>;
29
+ /** Box drawn around a block: none, a tinted background, a border, or a raised card. */
30
+ export type DisplaySurface = 'plain' | 'muted' | 'bordered' | 'elevated';
31
+ export type DisplaySize = 'sm' | 'md' | 'lg';
32
+ /** Text, or a lazy translation such as `() => t('key')`. */
33
+ export type DisplayText = LazyTextValue;
34
+ /** Text, a lazy translation, a VNode, or a render function. */
35
+ export type DisplayContent = LazyRenderableValue;
36
+ /**
37
+ * A link, or a function returning it, such as a signed URL fetched on demand. A function runs only
38
+ * when the link is used (opened, previewed or downloaded), with the button showing its progress.
39
+ */
40
+ export type DisplayUrl = string | (() => MaybePromise<string>);
41
+ /** Date accepted by date-aware blocks: a `Date`, an ISO string, or epoch milliseconds. */
42
+ export type DisplayDate = Date | string | number;
43
+ /** Button rendered by a block, with every `UButton` prop. */
44
+ export interface DisplayAction extends Omit<ButtonProps, 'label'> {
45
+ label?: DisplayText;
46
+ }
47
+ /** Badge rendered by a block, with every `UBadge` prop. `tone` is a shorthand for `color`. */
48
+ export interface DisplayChip extends Omit<BadgeProps, 'label'> {
49
+ label: DisplayText;
50
+ tone?: DisplayTone;
51
+ }
52
+ /** Avatar with every `UAvatar` prop. Without `src`, the initials of `alt` show. */
53
+ export type DisplayAvatar = AvatarProps;
54
+ /** Slot classes of a block: every key is optional and merged over the defaults. */
55
+ export type DisplayUiSlots<TSlot extends string> = Partial<Record<TSlot, string>>;
56
+ /** Props every block accepts. */
57
+ export interface DisplayBlockBase<TSlot extends string> {
58
+ /** Draws the block's skeleton instead of its content. */
59
+ loading?: boolean;
60
+ /** Class overrides per slot, merged over `appConfig.nuxtUiTools.display.ui.<kind>`. */
61
+ ui?: DisplayUiSlots<TSlot>;
62
+ }
63
+ /** Props of blocks listing items, which fold after `max` and reveal `step` more at a time. */
64
+ export interface DisplayRevealable {
65
+ /** Items shown before the "show more" button. */
66
+ max?: number;
67
+ /** Items each "show more" reveals. Defaults to everything left. */
68
+ step?: number;
69
+ /** Shown when there is nothing to list. Defaults to a localized "Nothing to show". */
70
+ empty?: DisplayContent;
71
+ }
File without changes
@@ -0,0 +1,3 @@
1
+ import type { DisplayUiSlots } from '../types/index.js';
2
+ /** Merges each slot's defaults with the app config and the block `ui`, later layers winning. */
3
+ export declare function resolveDisplayClasses<TSlot extends string>(defaults: Record<TSlot, string>, ...layers: (DisplayUiSlots<TSlot> | undefined)[]): Record<TSlot, string>;
@@ -0,0 +1,7 @@
1
+ import { twMerge } from "tailwind-merge";
2
+ export function resolveDisplayClasses(defaults, ...layers) {
3
+ const resolved = { ...defaults };
4
+ for (const key in defaults)
5
+ resolved[key] = twMerge(defaults[key], ...layers.map((layer) => layer?.[key]));
6
+ return resolved;
7
+ }
@@ -0,0 +1,6 @@
1
+ import type { AppConfig } from 'nuxt/schema';
2
+ import type { DisplayKind, DisplayPropsMap, DisplayUiConfig } from '../types/index.js';
3
+ /** `appConfig.nuxtUiTools.display`, or an empty config. */
4
+ export declare function resolveAppDisplayConfig(config: Pick<AppConfig, 'nuxtUiTools'>): DisplayUiConfig;
5
+ /** The props of a block over the defaults of its preset; an unknown preset changes nothing. */
6
+ export declare function applyDisplayPreset<TKind extends DisplayKind>(kind: TKind, props: DisplayPropsMap[TKind], preset: string | undefined, config: DisplayUiConfig): DisplayPropsMap[TKind];
@@ -0,0 +1,7 @@
1
+ export function resolveAppDisplayConfig(config) {
2
+ return config.nuxtUiTools?.display ?? {};
3
+ }
4
+ export function applyDisplayPreset(kind, props, preset, config) {
5
+ const defaults = preset === void 0 ? void 0 : config.presets?.[kind]?.[preset];
6
+ return defaults ? { ...defaults, ...props } : props;
7
+ }
@@ -0,0 +1,7 @@
1
+ import type { DisplayContent, DisplayText } from '../types/index.js';
2
+ /** `undefined`, `null`, `false` and `''` count as empty; a render function never does. */
3
+ export declare function isDisplayContentEmpty(content: DisplayContent | undefined): content is false | void | "" | null | undefined;
4
+ /** The string of a text or lazy text, or `undefined`. */
5
+ export declare function resolveDisplayText(value: DisplayText | undefined): string | undefined;
6
+ /** The string of content that is plain text, such as a `value` a copy button can copy. */
7
+ export declare function displayContentText(content: DisplayContent | undefined): string | undefined;
@@ -0,0 +1,13 @@
1
+ import { isFunction, isNumber, isString } from "../../shared/utils/predicate.js";
2
+ export function isDisplayContentEmpty(content) {
3
+ return content === void 0 || content === null || content === "" || content === false;
4
+ }
5
+ export function resolveDisplayText(value) {
6
+ if (isFunction(value)) return String(value());
7
+ if (isString(value) || isNumber(value)) return String(value);
8
+ return void 0;
9
+ }
10
+ export function displayContentText(content) {
11
+ if (isString(content) || isNumber(content)) return String(content);
12
+ return void 0;
13
+ }
@@ -0,0 +1,16 @@
1
+ import type { DisplayDate } from '../types/index.js';
2
+ /** A valid `Date`, or `null` for missing and unparsable input. */
3
+ export declare function toDisplayDate(value: DisplayDate | undefined | null): Date | null;
4
+ /** Calendar days from `from` to `to`, ignoring the time of day. */
5
+ export declare function calendarDaysBetween(from: Date, to: Date): number;
6
+ export declare function formatDisplayDate(date: Date, locale: string, options: Intl.DateTimeFormatOptions): string;
7
+ /** "Tomorrow", "In 3 days", "2 days ago", capitalized like a sentence. */
8
+ export declare function formatRelativeDays(days: number, locale: string): string;
9
+ /** "3 days", "1 day". */
10
+ export declare function formatDayCount(days: number, locale: string): string;
11
+ /** Parts of a calendar leaf: "OCT.", "24", "thu.". */
12
+ export declare function calendarLeaf(date: Date, locale: string): {
13
+ day: string;
14
+ month: string;
15
+ weekday: string;
16
+ };
@@ -0,0 +1,34 @@
1
+ import { isDate, isNumber, isString } from "../../shared/utils/predicate.js";
2
+ const DAY = 864e5;
3
+ export function toDisplayDate(value) {
4
+ if (isDate(value)) return Number.isNaN(value.getTime()) ? null : value;
5
+ if (isString(value) || isNumber(value)) {
6
+ const date = new Date(value);
7
+ return Number.isNaN(date.getTime()) ? null : date;
8
+ }
9
+ return null;
10
+ }
11
+ export function calendarDaysBetween(from, to) {
12
+ const start = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate());
13
+ const end = Date.UTC(to.getFullYear(), to.getMonth(), to.getDate());
14
+ return Math.round((end - start) / DAY);
15
+ }
16
+ export function formatDisplayDate(date, locale, options) {
17
+ return new Intl.DateTimeFormat(locale, options).format(date);
18
+ }
19
+ export function formatRelativeDays(days, locale) {
20
+ const text = new Intl.RelativeTimeFormat(locale, { numeric: "auto" }).format(days, "day");
21
+ return text.charAt(0).toLocaleUpperCase(locale) + text.slice(1);
22
+ }
23
+ export function formatDayCount(days, locale) {
24
+ return new Intl.NumberFormat(locale, { style: "unit", unit: "day", unitDisplay: "long" }).format(
25
+ days
26
+ );
27
+ }
28
+ export function calendarLeaf(date, locale) {
29
+ return {
30
+ day: formatDisplayDate(date, locale, { day: "numeric" }),
31
+ month: formatDisplayDate(date, locale, { month: "short" }).toLocaleUpperCase(locale),
32
+ weekday: formatDisplayDate(date, locale, { weekday: "short" })
33
+ };
34
+ }
@@ -0,0 +1,7 @@
1
+ export type JsonTokenKind = 'key' | 'string' | 'number' | 'literal' | 'punctuation' | 'space';
2
+ export interface JsonToken {
3
+ kind: JsonTokenKind;
4
+ text: string;
5
+ }
6
+ /** Splits JSON text into tokens for highlighting; unknown characters pass through as punctuation. */
7
+ export declare function tokenizeJson(source: string): JsonToken[];
@@ -0,0 +1,15 @@
1
+ const TOKEN = /("(?:\\.|[^"\\])*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|\b(true|false|null)\b|([{}[\],:])|(\s+)|(.)/gu;
2
+ export function tokenizeJson(source) {
3
+ const tokens = [];
4
+ for (const match of source.matchAll(TOKEN)) {
5
+ const [, text, colon, number, literal, punctuation, space, other] = match;
6
+ if (text !== void 0) {
7
+ tokens.push({ kind: colon ? "key" : "string", text });
8
+ if (colon) tokens.push({ kind: "punctuation", text: colon });
9
+ } else if (number !== void 0) tokens.push({ kind: "number", text: number });
10
+ else if (literal !== void 0) tokens.push({ kind: "literal", text: literal });
11
+ else if (space !== void 0) tokens.push({ kind: "space", text: space });
12
+ else tokens.push({ kind: "punctuation", text: punctuation ?? other ?? "" });
13
+ }
14
+ return tokens;
15
+ }
@@ -0,0 +1,7 @@
1
+ import type { DisplayMeterProps, DisplayTone } from '../types/index.js';
2
+ /** Share of `max` filled by `value`, between 0 and 1. */
3
+ export declare function meterShare(value: number, max: number): number;
4
+ /** The tone of a filled share: `error` and `warning` from their thresholds, else the given tone. */
5
+ export declare function meterTone(share: number, tone: DisplayTone | undefined, thresholds: DisplayMeterProps['thresholds']): DisplayTone;
6
+ /** Percent widths of parts sharing a track, summing to at most 100. */
7
+ export declare function partWidths(values: readonly number[], max: number): number[];
@@ -0,0 +1,13 @@
1
+ export function meterShare(value, max) {
2
+ if (!Number.isFinite(value) || !Number.isFinite(max) || max <= 0) return 0;
3
+ return Math.min(1, Math.max(0, value / max));
4
+ }
5
+ export function meterTone(share, tone, thresholds) {
6
+ const percent = share * 100;
7
+ if (thresholds?.error !== void 0 && percent >= thresholds.error) return "error";
8
+ if (thresholds?.warning !== void 0 && percent >= thresholds.warning) return "warning";
9
+ return tone ?? "primary";
10
+ }
11
+ export function partWidths(values, max) {
12
+ return values.map((value) => meterShare(value, max) * 100);
13
+ }
@@ -0,0 +1,47 @@
1
+ export type DisplaySkeletonLayout = 'lines' | 'rows' | 'tiles' | 'card' | 'media' | 'ring' | 'block';
2
+ /** The component drawing each display kind. */
3
+ export declare const DISPLAY_BLOCKS: {
4
+ readonly accordion: import("vue").DefineComponent<import("../types/index.js").DisplayAccordionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayAccordionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ readonly alert: import("vue").DefineComponent<import("../types/index.js").DisplayAlertProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayAlertProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ readonly breakdown: import("vue").DefineComponent<import("../types/index.js").DisplayBreakdownProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayBreakdownProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ readonly chart: import("vue").DefineComponent<import("../types/index.js").DisplayChartProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayChartProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ readonly code: import("vue").DefineComponent<import("../types/index.js").DisplayCodeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayCodeProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
+ readonly date: import("vue").DefineComponent<import("../types/index.js").DisplayDateProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayDateProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ readonly diff: import("vue").DefineComponent<import("../types/index.js").DisplayDiffProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayDiffProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ readonly empty: import("vue").DefineComponent<import("../types/index.js").DisplayEmptyProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayEmptyProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ readonly facts: import("vue").DefineComponent<import("../types/index.js").DisplayFactsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayFactsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ readonly heading: import("vue").DefineComponent<import("../types/index.js").DisplayHeadingProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayHeadingProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ readonly list: import("vue").DefineComponent<import("../types/index.js").DisplayListProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayListProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
+ readonly media: import("vue").DefineComponent<import("../types/index.js").DisplayMediaProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayMediaProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
+ readonly meter: import("vue").DefineComponent<import("../types/index.js").DisplayMeterProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayMeterProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ readonly person: import("vue").DefineComponent<import("../types/index.js").DisplayPersonProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayPersonProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ readonly record: import("vue").DefineComponent<import("../types/index.js").DisplayRecordProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayRecordProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ readonly stat: import("vue").DefineComponent<import("../types/index.js").DisplayStatProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayStatProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
20
+ readonly table: import("vue").DefineComponent<import("../types/index.js").DisplayTableProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayTableProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ readonly text: import("vue").DefineComponent<import("../types/index.js").DisplayTextProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayTextProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ readonly timeline: import("vue").DefineComponent<import("../types/index.js").DisplayTimelineProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("../types/index.js").DisplayTimelineProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
+ };
24
+ /** Kinds in a stable order, for docs and pickers. */
25
+ export declare const DISPLAY_KINDS: readonly (keyof import("../types/index.js").DisplayPropsMap)[];
26
+ /** Skeleton drawn for each kind while its props load. */
27
+ export declare const DISPLAY_SKELETON_LAYOUTS: {
28
+ readonly accordion: "rows";
29
+ readonly alert: "block";
30
+ readonly breakdown: "rows";
31
+ readonly chart: "block";
32
+ readonly code: "block";
33
+ readonly date: "card";
34
+ readonly diff: "rows";
35
+ readonly empty: "block";
36
+ readonly facts: "rows";
37
+ readonly heading: "lines";
38
+ readonly list: "lines";
39
+ readonly media: "media";
40
+ readonly meter: "lines";
41
+ readonly person: "card";
42
+ readonly record: "card";
43
+ readonly stat: "lines";
44
+ readonly table: "rows";
45
+ readonly text: "lines";
46
+ readonly timeline: "lines";
47
+ };
@@ -0,0 +1,64 @@
1
+ import DisplayAccordion from "../components/blocks/display-accordion.vue";
2
+ import DisplayAlert from "../components/blocks/display-alert.vue";
3
+ import DisplayBreakdown from "../components/blocks/display-breakdown.vue";
4
+ import DisplayChart from "../components/blocks/display-chart.vue";
5
+ import DisplayCode from "../components/blocks/display-code.vue";
6
+ import DisplayDate from "../components/blocks/display-date.vue";
7
+ import DisplayDiff from "../components/blocks/display-diff.vue";
8
+ import DisplayEmpty from "../components/blocks/display-empty.vue";
9
+ import DisplayFacts from "../components/blocks/display-facts.vue";
10
+ import DisplayHeading from "../components/blocks/display-heading.vue";
11
+ import DisplayList from "../components/blocks/display-list.vue";
12
+ import DisplayMedia from "../components/blocks/display-media.vue";
13
+ import DisplayMeter from "../components/blocks/display-meter.vue";
14
+ import DisplayPerson from "../components/blocks/display-person.vue";
15
+ import DisplayRecord from "../components/blocks/display-record.vue";
16
+ import DisplayStat from "../components/blocks/display-stat.vue";
17
+ import DisplayTable from "../components/blocks/display-table.vue";
18
+ import DisplayText from "../components/blocks/display-text.vue";
19
+ import DisplayTimeline from "../components/blocks/display-timeline.vue";
20
+ export const DISPLAY_BLOCKS = {
21
+ accordion: DisplayAccordion,
22
+ alert: DisplayAlert,
23
+ breakdown: DisplayBreakdown,
24
+ chart: DisplayChart,
25
+ code: DisplayCode,
26
+ date: DisplayDate,
27
+ diff: DisplayDiff,
28
+ empty: DisplayEmpty,
29
+ facts: DisplayFacts,
30
+ heading: DisplayHeading,
31
+ list: DisplayList,
32
+ media: DisplayMedia,
33
+ meter: DisplayMeter,
34
+ person: DisplayPerson,
35
+ record: DisplayRecord,
36
+ stat: DisplayStat,
37
+ table: DisplayTable,
38
+ text: DisplayText,
39
+ timeline: DisplayTimeline
40
+ };
41
+ export const DISPLAY_KINDS = Object.freeze(
42
+ Object.keys(DISPLAY_BLOCKS).filter((kind) => kind in DISPLAY_BLOCKS)
43
+ );
44
+ export const DISPLAY_SKELETON_LAYOUTS = {
45
+ accordion: "rows",
46
+ alert: "block",
47
+ breakdown: "rows",
48
+ chart: "block",
49
+ code: "block",
50
+ date: "card",
51
+ diff: "rows",
52
+ empty: "block",
53
+ facts: "rows",
54
+ heading: "lines",
55
+ list: "lines",
56
+ media: "media",
57
+ meter: "lines",
58
+ person: "card",
59
+ record: "card",
60
+ stat: "lines",
61
+ table: "rows",
62
+ text: "lines",
63
+ timeline: "lines"
64
+ };
@@ -0,0 +1,7 @@
1
+ import type { DisplayUiConfig } from '../types/index.js';
2
+ /**
3
+ * The stylesheet of the tones an app registers or restyles: their `--nut-display-<tone>*`
4
+ * variables (light, then `.dark`) and, for new tones, the class that points `--nut-tone*` at them.
5
+ * Names other than lowercase words and values that could leave the declaration are skipped.
6
+ */
7
+ export declare function buildDisplayToneCss(tones: DisplayUiConfig['tones']): string;
@@ -0,0 +1,38 @@
1
+ import { isBuiltinTone } from "./tone.js";
2
+ const TONE_NAME = /^[a-z][a-z0-9-]*$/u;
3
+ const UNSAFE_VALUE = /[{}<>;]/u;
4
+ export function buildDisplayToneCss(tones) {
5
+ const light = [];
6
+ const dark = [];
7
+ const classes = [];
8
+ for (const [name, definition] of Object.entries(tones ?? {})) {
9
+ if (!definition || !TONE_NAME.test(name)) continue;
10
+ const builtin = isBuiltinTone(name);
11
+ if (!builtin && !definition.color) continue;
12
+ light.push(...declarations(name, definition, !builtin));
13
+ if (definition.dark) dark.push(...declarations(name, definition.dark, false));
14
+ if (!builtin) classes.push(toneClassRule(name));
15
+ }
16
+ return [
17
+ light.length ? `:root{${light.join(";")}}` : "",
18
+ dark.length ? `.dark{${dark.join(";")}}` : "",
19
+ ...classes
20
+ ].filter(Boolean).join("\n");
21
+ }
22
+ function declarations(name, colors, fill) {
23
+ const mix = (share) => fill && colors.color ? `color-mix(in oklab, ${colors.color} ${share}%, var(--ui-bg))` : void 0;
24
+ const entries = [
25
+ ["", colors.color],
26
+ ["-ink", colors.ink ?? (fill ? colors.color : void 0)],
27
+ ["-soft", colors.soft ?? mix(12)],
28
+ ["-line", colors.line ?? mix(40)],
29
+ ["-contrast", colors.contrast ?? (fill ? "var(--ui-text-inverted)" : void 0)]
30
+ ];
31
+ return entries.flatMap(
32
+ ([part, value]) => value && !UNSAFE_VALUE.test(value) ? [`--nut-display-${name}${part}:${value}`] : []
33
+ );
34
+ }
35
+ function toneClassRule(name) {
36
+ const variable = (part) => `var(--nut-display-${name}${part ? `-${part}` : ""})`;
37
+ return `:where(.nut-display-tone-${name}){--nut-tone:${variable("")};--nut-tone-ink:${variable("ink")};--nut-tone-soft:${variable("soft")};--nut-tone-line:${variable("line")};--nut-tone-contrast:${variable("contrast")}}`;
38
+ }
@@ -0,0 +1,26 @@
1
+ import type { DisplayBuiltinTone, DisplayTone } from '../types/index.js';
2
+ /**
3
+ * Class that points the `--nut-tone*` variables of an element at a tone. Built-in tones are
4
+ * defined in the token stylesheet; registered ones by the rules the display plugin injects.
5
+ */
6
+ export declare function displayToneClass(tone: DisplayTone): string;
7
+ /** Whether a tone is one of the Nuxt UI colors, which Nuxt UI components take as `color`. */
8
+ export declare function isBuiltinTone(tone: string): tone is DisplayBuiltinTone;
9
+ /** Box classes of each surface. `plain` adds nothing so a block sits on the page. */
10
+ export declare const DISPLAY_SURFACE_CLASSES: {
11
+ readonly bordered: "rounded-[var(--nut-display-radius)] border border-default";
12
+ readonly elevated: "rounded-[var(--nut-display-radius)] bg-default shadow-[0_10px_28px_-14px_rgb(0_0_0/0.3)] ring ring-default";
13
+ readonly muted: "rounded-[var(--nut-display-radius)] bg-elevated";
14
+ readonly plain: "";
15
+ };
16
+ /** Padding applied inside a boxed surface. */
17
+ export declare const DISPLAY_SURFACE_PADDING: {
18
+ readonly bordered: "p-4";
19
+ readonly elevated: "p-4";
20
+ readonly muted: "p-4";
21
+ readonly plain: "";
22
+ };
23
+ /** A stable tone for a name, so a person keeps the same tint everywhere. */
24
+ export declare function toneFromName(name: string): DisplayTone;
25
+ /** Up to two initials of a name. */
26
+ export declare function initialsOf(name: string): string;