nuxt-ui-tools 1.24.0 → 1.25.1

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 (210) 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 +96 -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 +136 -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 +184 -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 +241 -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 +144 -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 +179 -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 +154 -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 +75 -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 +195 -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 +103 -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 +301 -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 +336 -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 +302 -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 +153 -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 +268 -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 +189 -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 +136 -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 +141 -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 +238 -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 +27 -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 +71 -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 +36 -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 +11 -0
  86. package/dist/runtime/display/components/parts/display-record-media.vue +61 -0
  87. package/dist/runtime/display/components/parts/display-record-media.vue.d.ts +11 -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/directives/reveal-truncated.d.ts +10 -0
  108. package/dist/runtime/display/directives/reveal-truncated.js +31 -0
  109. package/dist/runtime/display/index.d.ts +4 -0
  110. package/dist/runtime/display/index.js +3 -0
  111. package/dist/runtime/display/plugins/display-tones.d.ts +3 -0
  112. package/dist/runtime/display/plugins/display-tones.js +17 -0
  113. package/dist/runtime/display/types/blocks/accordion.d.ts +18 -0
  114. package/dist/runtime/display/types/blocks/accordion.js +0 -0
  115. package/dist/runtime/display/types/blocks/alert.d.ts +31 -0
  116. package/dist/runtime/display/types/blocks/alert.js +0 -0
  117. package/dist/runtime/display/types/blocks/breakdown.d.ts +36 -0
  118. package/dist/runtime/display/types/blocks/breakdown.js +0 -0
  119. package/dist/runtime/display/types/blocks/chart.d.ts +23 -0
  120. package/dist/runtime/display/types/blocks/chart.js +0 -0
  121. package/dist/runtime/display/types/blocks/code.d.ts +21 -0
  122. package/dist/runtime/display/types/blocks/code.js +0 -0
  123. package/dist/runtime/display/types/blocks/date.d.ts +27 -0
  124. package/dist/runtime/display/types/blocks/date.js +0 -0
  125. package/dist/runtime/display/types/blocks/diff.d.ts +20 -0
  126. package/dist/runtime/display/types/blocks/diff.js +0 -0
  127. package/dist/runtime/display/types/blocks/empty.d.ts +13 -0
  128. package/dist/runtime/display/types/blocks/empty.js +0 -0
  129. package/dist/runtime/display/types/blocks/facts.d.ts +52 -0
  130. package/dist/runtime/display/types/blocks/facts.js +0 -0
  131. package/dist/runtime/display/types/blocks/heading.d.ts +19 -0
  132. package/dist/runtime/display/types/blocks/heading.js +0 -0
  133. package/dist/runtime/display/types/blocks/list.d.ts +36 -0
  134. package/dist/runtime/display/types/blocks/list.js +0 -0
  135. package/dist/runtime/display/types/blocks/media.d.ts +42 -0
  136. package/dist/runtime/display/types/blocks/media.js +0 -0
  137. package/dist/runtime/display/types/blocks/meter.d.ts +48 -0
  138. package/dist/runtime/display/types/blocks/meter.js +0 -0
  139. package/dist/runtime/display/types/blocks/person.d.ts +34 -0
  140. package/dist/runtime/display/types/blocks/person.js +0 -0
  141. package/dist/runtime/display/types/blocks/record.d.ts +44 -0
  142. package/dist/runtime/display/types/blocks/record.js +0 -0
  143. package/dist/runtime/display/types/blocks/stat.d.ts +44 -0
  144. package/dist/runtime/display/types/blocks/stat.js +0 -0
  145. package/dist/runtime/display/types/blocks/table.d.ts +28 -0
  146. package/dist/runtime/display/types/blocks/table.js +0 -0
  147. package/dist/runtime/display/types/blocks/text.d.ts +22 -0
  148. package/dist/runtime/display/types/blocks/text.js +0 -0
  149. package/dist/runtime/display/types/blocks/timeline.d.ts +37 -0
  150. package/dist/runtime/display/types/blocks/timeline.js +0 -0
  151. package/dist/runtime/display/types/config.d.ts +60 -0
  152. package/dist/runtime/display/types/config.js +0 -0
  153. package/dist/runtime/display/types/index.d.ts +22 -0
  154. package/dist/runtime/display/types/index.js +0 -0
  155. package/dist/runtime/display/types/registry.d.ts +57 -0
  156. package/dist/runtime/display/types/registry.js +0 -0
  157. package/dist/runtime/display/types/shared.d.ts +80 -0
  158. package/dist/runtime/display/types/shared.js +0 -0
  159. package/dist/runtime/display/utils/classes.d.ts +3 -0
  160. package/dist/runtime/display/utils/classes.js +7 -0
  161. package/dist/runtime/display/utils/config.d.ts +11 -0
  162. package/dist/runtime/display/utils/config.js +17 -0
  163. package/dist/runtime/display/utils/content.d.ts +7 -0
  164. package/dist/runtime/display/utils/content.js +13 -0
  165. package/dist/runtime/display/utils/dates.d.ts +16 -0
  166. package/dist/runtime/display/utils/dates.js +34 -0
  167. package/dist/runtime/display/utils/json.d.ts +7 -0
  168. package/dist/runtime/display/utils/json.js +15 -0
  169. package/dist/runtime/display/utils/links.d.ts +12 -0
  170. package/dist/runtime/display/utils/links.js +9 -0
  171. package/dist/runtime/display/utils/meter.d.ts +7 -0
  172. package/dist/runtime/display/utils/meter.js +13 -0
  173. package/dist/runtime/display/utils/registry.d.ts +47 -0
  174. package/dist/runtime/display/utils/registry.js +64 -0
  175. package/dist/runtime/display/utils/tone-css.d.ts +7 -0
  176. package/dist/runtime/display/utils/tone-css.js +38 -0
  177. package/dist/runtime/display/utils/tone.d.ts +26 -0
  178. package/dist/runtime/display/utils/tone.js +38 -0
  179. package/dist/runtime/display/utils/urls.d.ts +10 -0
  180. package/dist/runtime/display/utils/urls.js +33 -0
  181. package/dist/runtime/file-preview/components/shell/file-preview-stage.vue +5 -3
  182. package/dist/runtime/file-preview/composables/use-file-preview-source.d.ts +7 -0
  183. package/dist/runtime/file-preview/composables/use-file-preview-source.js +7 -1
  184. package/dist/runtime/file-preview/index.d.ts +1 -0
  185. package/dist/runtime/file-preview/index.js +1 -0
  186. package/dist/runtime/file-preview/types/file.d.ts +9 -0
  187. package/dist/runtime/file-preview/utils/errors.d.ts +30 -0
  188. package/dist/runtime/file-preview/utils/errors.js +26 -0
  189. package/dist/runtime/form/components/utils/form-file-preview.vue +7 -2
  190. package/dist/runtime/form/composables/use-form-root.js +17 -4
  191. package/dist/runtime/form/composables/use-form-runtime.js +7 -2
  192. package/dist/runtime/form/fields/index.d.ts +5 -0
  193. package/dist/runtime/form/fields/info/component.vue +51 -19
  194. package/dist/runtime/form/fields/info/config.d.ts +5 -0
  195. package/dist/runtime/form/fields/info/config.js +2 -1
  196. package/dist/runtime/form/fields/info/types.d.ts +78 -4
  197. package/dist/runtime/form/fields/info/use-info-display.d.ts +20 -0
  198. package/dist/runtime/form/fields/info/use-info-display.js +82 -0
  199. package/dist/runtime/form/fields/upload/upload-item.vue +10 -2
  200. package/dist/runtime/form/types/api.d.ts +6 -0
  201. package/dist/runtime/form/types/runtime.d.ts +2 -0
  202. package/dist/runtime/form/utils/dynamic.d.ts +6 -0
  203. package/dist/runtime/form/utils/dynamic.js +7 -0
  204. package/dist/runtime/i18n/locales/en.js +27 -0
  205. package/dist/runtime/i18n/locales/fr.js +27 -0
  206. package/dist/runtime/i18n/types.d.ts +35 -0
  207. package/dist/runtime/shared/styles/tokens.css +1 -1
  208. package/dist/runtime/shared/utils/file.d.ts +1 -1
  209. package/dist/runtime/table/utils/data-list-ui.d.ts +1 -1
  210. package/package.json +16 -1
package/dist/module.d.mts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as _nuxt_schema from '@nuxt/schema';
2
2
  import { ModuleOptions as ModuleOptions$1 } from 'nuxt-viewport';
3
3
  import { DashboardUiConfig } from '../dist/runtime/dashboard/types/index.js';
4
+ import { DisplayUiConfig } from '../dist/runtime/display/types/index.js';
4
5
  import { FormUiConfig } from '../dist/runtime/form/types/index.js';
5
6
  import { DataListUiConfig } from '../dist/runtime/table/types/index.js';
6
7
 
@@ -12,6 +13,7 @@ declare module '@nuxt/schema' {
12
13
  nuxtUiTools?: {
13
14
  dashboard?: DashboardUiConfig;
14
15
  dataList?: DataListUiConfig;
16
+ display?: DisplayUiConfig;
15
17
  form?: FormUiConfig;
16
18
  };
17
19
  }
@@ -19,6 +21,7 @@ declare module '@nuxt/schema' {
19
21
  nuxtUiTools?: {
20
22
  dashboard?: DashboardUiConfig;
21
23
  dataList?: DataListUiConfig;
24
+ display?: DisplayUiConfig;
22
25
  form?: FormUiConfig;
23
26
  };
24
27
  }
package/dist/module.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "configKey": "nuxtUiTools",
6
6
  "docs": "https://ui.nuxt.com/docs/getting-started/installation/nuxt",
7
7
  "name": "nuxt-ui-tools",
8
- "version": "1.24.0",
8
+ "version": "1.25.1",
9
9
  "builder": {
10
10
  "@nuxt/module-builder": "1.0.3",
11
11
  "unbuild": "unknown"
package/dist/module.mjs CHANGED
@@ -120,6 +120,12 @@ function getPublicComponents(runtimeDir, options) {
120
120
  global: options.global,
121
121
  name: `${prefix}Dashboard${part}`
122
122
  })),
123
+ // Display
124
+ {
125
+ filePath: `${runtimeDir}/display/components/display.vue`,
126
+ global: options.global,
127
+ name: `${prefix}Display`
128
+ },
123
129
  // File preview
124
130
  {
125
131
  filePath: `${runtimeDir}/file-preview/components/provider/file-preview-provider.vue`,
@@ -417,6 +423,7 @@ const viewportDefaults = {
417
423
  };
418
424
  const publicRuntimeDomains = [
419
425
  "dashboard",
426
+ "display",
420
427
  "file-preview",
421
428
  "form",
422
429
  "i18n",
@@ -490,6 +497,7 @@ const module$1 = defineNuxtModule({
490
497
  addPlugin(resolve("./runtime/query-prefetch/plugins/link-prefetch.client"));
491
498
  addPlugin(resolve("./runtime/form/plugins/form-api"));
492
499
  addPlugin(resolve("./runtime/file-preview/plugins/file-preview-api"));
500
+ addPlugin(resolve("./runtime/display/plugins/display-tones"));
493
501
  addVitePlugin({
494
502
  enforce: "pre",
495
503
  name: "nuxt-ui-tools:query-prefetch-macro",
@@ -0,0 +1,4 @@
1
+ import type { DisplayAccordionProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayAccordionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayAccordionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,96 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { computed, defineAsyncComponent, ref, useId } from "vue";
4
+ import { useDisplayAppUi } from "../../composables/use-display-config";
5
+ import { useDisplayIcons } from "../../composables/use-display-icons";
6
+ import { vRevealTruncated } from "../../directives/reveal-truncated";
7
+ import { resolveDisplayClasses } from "../../utils/classes";
8
+ import DisplayRender from "../parts/display-render";
9
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
10
+ const {
11
+ variant = "separated",
12
+ items,
13
+ multiple = false,
14
+ loading = false,
15
+ ui = void 0
16
+ } = defineProps({
17
+ variant: { type: String, required: false },
18
+ items: { type: Array, required: true },
19
+ multiple: { type: Boolean, required: false },
20
+ loading: { type: Boolean, required: false },
21
+ ui: { type: Object, required: false }
22
+ });
23
+ const DisplayBlock = defineAsyncComponent(() => import("../display.vue"));
24
+ const id = useId();
25
+ const icons = useDisplayIcons();
26
+ const appUi = useDisplayAppUi("accordion");
27
+ const open = ref(
28
+ items.flatMap((item, index) => item.defaultOpen ? [index] : []).slice(0, multiple ? void 0 : 1)
29
+ );
30
+ const classes = computed(
31
+ () => resolveDisplayClasses(
32
+ {
33
+ chevron: "size-4 shrink-0 text-muted transition-transform duration-200",
34
+ content: variant === "flush" ? "pb-3 text-sm text-toned" : "px-3 pb-3 text-sm text-toned",
35
+ icon: "size-4 shrink-0 text-muted",
36
+ item: variant === "flush" ? "" : "overflow-hidden rounded-[var(--nut-display-radius)] border border-default",
37
+ label: "min-w-0 flex-1",
38
+ root: variant === "flush" ? "flex min-w-0 flex-col divide-y divide-default border-y border-default" : "flex min-w-0 flex-col gap-1.5",
39
+ trigger: `flex w-full cursor-pointer items-center gap-2 py-2.5 text-start text-sm font-semibold text-highlighted ${variant === "flush" ? "" : "px-3 hover:bg-elevated"}`
40
+ },
41
+ appUi.value,
42
+ ui
43
+ )
44
+ );
45
+ function toggle(index) {
46
+ const isOpen = open.value.includes(index);
47
+ if (multiple)
48
+ open.value = isOpen ? open.value.filter((entry) => entry !== index) : [...open.value, index];
49
+ else open.value = isOpen ? [] : [index];
50
+ }
51
+ </script>
52
+
53
+ <template>
54
+ <DisplaySkeleton v-if="loading" layout="rows" :count="Math.max(items.length, 2)" />
55
+ <div v-else :class="classes.root" data-display="accordion" :data-variant="variant">
56
+ <div
57
+ v-for="(item, index) in items"
58
+ :key="index"
59
+ :class="classes.item"
60
+ :data-state="open.includes(index) ? 'open' : 'closed'"
61
+ >
62
+ <button
63
+ :id="`${id}-trigger-${index}`"
64
+ type="button"
65
+ :class="classes.trigger"
66
+ :aria-expanded="open.includes(index)"
67
+ :aria-controls="`${id}-panel-${index}`"
68
+ @click="toggle(index)"
69
+ >
70
+ <UIcon v-if="item.icon" :name="item.icon" :class="classes.icon" />
71
+ <span v-reveal-truncated :class="classes.label"
72
+ ><DisplayRender :content="item.label"
73
+ /></span>
74
+ <UIcon
75
+ :name="icons.chevronDown"
76
+ :class="[classes.chevron, open.includes(index) ? 'rotate-180' : '']"
77
+ />
78
+ </button>
79
+ <div
80
+ v-if="open.includes(index)"
81
+ :id="`${id}-panel-${index}`"
82
+ role="region"
83
+ :aria-labelledby="`${id}-trigger-${index}`"
84
+ :class="classes.content"
85
+ >
86
+ <DisplayBlock
87
+ v-if="item.block"
88
+ :display="item.block.display"
89
+ :props="item.block.props"
90
+ :preset="item.block.preset"
91
+ />
92
+ <DisplayRender v-else :content="item.content" />
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayAccordionProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayAccordionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayAccordionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import type { DisplayAlertProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayAlertProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayAlertProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,136 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { computed, ref } from "vue";
4
+ import { useDisplayAppUi } from "../../composables/use-display-config";
5
+ import { toneIcon, useDisplayIcons } from "../../composables/use-display-icons";
6
+ import { useDisplayLocale } from "../../composables/use-display-locale";
7
+ import { vRevealTruncated } from "../../directives/reveal-truncated";
8
+ import { resolveDisplayClasses } from "../../utils/classes";
9
+ import { isDisplayContentEmpty } from "../../utils/content";
10
+ import { displayToneClass } from "../../utils/tone";
11
+ import DisplayActions from "../parts/display-actions.vue";
12
+ import DisplayRender from "../parts/display-render";
13
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
14
+ const {
15
+ tone = "info",
16
+ appearance = "soft",
17
+ icon = void 0,
18
+ title = void 0,
19
+ message = void 0,
20
+ items = void 0,
21
+ list = void 0,
22
+ details = void 0,
23
+ defaultOpen = false,
24
+ actions = void 0,
25
+ loading = false,
26
+ ui = void 0
27
+ } = defineProps({
28
+ tone: { type: String, required: false },
29
+ appearance: { type: String, required: false },
30
+ icon: { type: [String, Boolean], required: false },
31
+ title: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
32
+ message: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
33
+ items: { type: Array, required: false },
34
+ list: { type: Array, required: false },
35
+ details: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
36
+ defaultOpen: { type: Boolean, required: false },
37
+ actions: { type: Array, required: false },
38
+ loading: { type: Boolean, required: false },
39
+ ui: { type: Object, required: false }
40
+ });
41
+ const BOX = "flex items-start gap-2.5 rounded-[var(--nut-display-radius)] px-3.5 py-3 text-sm";
42
+ const ROOT_CLASSES = {
43
+ banner: "flex flex-wrap items-center gap-3 rounded-[var(--nut-display-radius)] border border-default bg-default p-3.5 text-sm text-default",
44
+ callout: "flex items-start gap-2.5 rounded-e-[var(--nut-display-radius)] border-s-[3px] border-[var(--nut-tone)] bg-elevated px-3.5 py-3 text-sm text-default",
45
+ inline: "flex items-start gap-2 text-sm text-toned",
46
+ outline: `${BOX} border border-[var(--nut-tone-line)] text-[var(--nut-tone-ink)]`,
47
+ soft: `${BOX} bg-[var(--nut-tone-soft)] text-[var(--nut-tone-ink)]`,
48
+ solid: `${BOX} bg-[var(--nut-tone)] text-[var(--nut-tone-contrast)]`,
49
+ subtle: `${BOX} border border-[var(--nut-tone-line)] bg-[var(--nut-tone-soft)] text-[var(--nut-tone-ink)]`
50
+ };
51
+ const { t } = useDisplayLocale();
52
+ const icons = useDisplayIcons();
53
+ const appUi = useDisplayAppUi("alert");
54
+ const open = ref(defaultOpen);
55
+ const resolvedIcon = computed(
56
+ () => icon === false ? void 0 : icon ?? toneIcon(icons.value, tone)
57
+ );
58
+ const plain = computed(() => ["banner", "callout", "inline"].includes(appearance));
59
+ const titled = computed(() => !isDisplayContentEmpty(title));
60
+ const classes = computed(
61
+ () => resolveDisplayClasses(
62
+ {
63
+ actions: appearance === "banner" ? "ms-auto flex flex-wrap gap-2" : "mt-2.5 flex flex-wrap gap-2",
64
+ body: "min-w-0 flex-1",
65
+ details: "mt-1.5 text-xs opacity-90",
66
+ icon: appearance === "banner" ? "grid size-9 shrink-0 place-items-center rounded-[var(--nut-display-radius)] bg-[var(--nut-tone-soft)] text-[var(--nut-tone-ink)]" : `mt-px size-4.5 shrink-0 ${plain.value ? "text-[var(--nut-tone-ink)]" : ""}`,
67
+ item: "flex items-start gap-2",
68
+ itemIcon: "mt-0.5 size-3.5 shrink-0",
69
+ items: "mt-1.5 flex flex-col gap-1",
70
+ list: "mt-1 list-disc ps-4.5 marker:opacity-60",
71
+ message: appearance === "banner" ? "mt-0.5 text-muted" : titled.value ? "mt-0.5 opacity-90" : "",
72
+ root: ROOT_CLASSES[appearance],
73
+ title: appearance === "banner" ? "font-semibold text-highlighted" : "font-semibold",
74
+ toggle: "mt-1.5 inline-flex cursor-pointer items-center gap-1 text-xs font-semibold underline underline-offset-2"
75
+ },
76
+ appUi.value,
77
+ ui
78
+ )
79
+ );
80
+ </script>
81
+
82
+ <template>
83
+ <DisplaySkeleton v-if="loading" layout="block" />
84
+ <div
85
+ v-else
86
+ :class="[classes.root, displayToneClass(tone)]"
87
+ :role="tone === 'error' || tone === 'warning' ? 'status' : void 0"
88
+ :data-tone="tone"
89
+ :data-appearance="appearance"
90
+ data-display="alert"
91
+ >
92
+ <span v-if="resolvedIcon && appearance === 'banner'" :class="classes.icon">
93
+ <UIcon :name="resolvedIcon" class="size-4.5" />
94
+ </span>
95
+ <UIcon v-else-if="resolvedIcon" :name="resolvedIcon" :class="classes.icon" />
96
+ <div :class="classes.body">
97
+ <div v-if="titled" v-reveal-truncated :class="classes.title">
98
+ <DisplayRender :content="title" />
99
+ </div>
100
+ <div v-if="!isDisplayContentEmpty(message)" v-reveal-truncated :class="classes.message">
101
+ <DisplayRender :content="message" />
102
+ </div>
103
+ <div v-if="items?.length" :class="classes.items">
104
+ <div v-for="(item, index) in items" :key="index" :class="classes.item">
105
+ <UIcon :name="item.icon ?? resolvedIcon ?? icons.info" :class="classes.itemIcon" />
106
+ <span class="min-w-0"><DisplayRender :content="item.text" /></span>
107
+ </div>
108
+ </div>
109
+ <ul v-if="list?.length" :class="classes.list">
110
+ <li v-for="(content, index) in list" :key="index"><DisplayRender :content="content" /></li>
111
+ </ul>
112
+ <template v-if="!isDisplayContentEmpty(details)">
113
+ <button type="button" :class="classes.toggle" :aria-expanded="open" @click="open = !open">
114
+ {{ open ? t("display.hideDetails") : t("display.showDetails") }}
115
+ <UIcon
116
+ :name="icons.chevronDown"
117
+ class="size-3.5 transition-transform"
118
+ :class="open ? 'rotate-180' : ''"
119
+ />
120
+ </button>
121
+ <div v-if="open" :class="classes.details"><DisplayRender :content="details" /></div>
122
+ </template>
123
+ <DisplayActions
124
+ v-if="actions?.length && appearance !== 'banner'"
125
+ :actions="actions"
126
+ size="xs"
127
+ :class="classes.actions"
128
+ />
129
+ </div>
130
+ <DisplayActions
131
+ v-if="actions?.length && appearance === 'banner'"
132
+ :actions="actions"
133
+ :class="classes.actions"
134
+ />
135
+ </div>
136
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayAlertProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayAlertProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayAlertProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import type { DisplayBreakdownProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayBreakdownProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayBreakdownProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,184 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { twMerge } from "tailwind-merge";
4
+ import { computed, ref } from "vue";
5
+ import { useDisplayAppUi } from "../../composables/use-display-config";
6
+ import { useDisplayIcons } from "../../composables/use-display-icons";
7
+ import { useDisplayLocale } from "../../composables/use-display-locale";
8
+ import { vRevealTruncated } from "../../directives/reveal-truncated";
9
+ import { resolveDisplayClasses } from "../../utils/classes";
10
+ import { isDisplayContentEmpty } from "../../utils/content";
11
+ import { DISPLAY_SURFACE_CLASSES, displayToneClass } from "../../utils/tone";
12
+ import DisplayChip from "../parts/display-chip.vue";
13
+ import DisplayRender from "../parts/display-render";
14
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
15
+ const {
16
+ mode = "open",
17
+ title = void 0,
18
+ lines,
19
+ total = void 0,
20
+ columns = void 0,
21
+ footnote = void 0,
22
+ defaultOpen = false,
23
+ surface = "bordered",
24
+ loading = false,
25
+ ui = void 0
26
+ } = defineProps({
27
+ mode: { type: String, required: false },
28
+ title: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
29
+ lines: { type: Array, required: true },
30
+ total: { type: Object, required: false },
31
+ columns: { type: Array, required: false },
32
+ footnote: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
33
+ defaultOpen: { type: Boolean, required: false },
34
+ surface: { type: String, required: false },
35
+ loading: { type: Boolean, required: false },
36
+ ui: { type: Object, required: false }
37
+ });
38
+ const { t } = useDisplayLocale();
39
+ const icons = useDisplayIcons();
40
+ const appUi = useDisplayAppUi("breakdown");
41
+ const open = ref(defaultOpen);
42
+ const boxed = computed(() => surface !== "plain");
43
+ const classes = computed(
44
+ () => resolveDisplayClasses(
45
+ {
46
+ body: "mx-2 mb-2 rounded-[calc(var(--nut-display-radius)*0.75)] bg-elevated px-3 py-1",
47
+ detail: "ms-1.5 text-xs text-dimmed tabular-nums",
48
+ footnote: "mt-1.5 text-xs text-dimmed",
49
+ header: "bg-elevated",
50
+ headerCell: "px-4 py-2 text-end text-[11px] font-bold tracking-[0.07em] text-muted uppercase first:text-start",
51
+ label: "min-w-0 text-toned",
52
+ line: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5 py-1.5",
53
+ root: `min-w-0 text-sm ${DISPLAY_SURFACE_CLASSES[surface]} ${boxed.value && mode === "open" ? "px-4 pt-1" : ""}`,
54
+ title: "pt-2 pb-1 text-[11px] font-bold tracking-[0.07em] text-muted uppercase",
55
+ toggle: "inline-flex cursor-pointer items-center gap-1 text-xs font-semibold text-primary",
56
+ total: mode === "collapsible" ? "flex items-center gap-3 px-4 py-2.5" : "mt-1 flex flex-wrap items-center justify-between gap-x-3 gap-y-1 border-t border-dashed border-accented py-2.5",
57
+ totalLabel: "flex items-center gap-2 font-bold text-highlighted",
58
+ totalValue: "text-lg font-extrabold whitespace-nowrap text-highlighted tabular-nums",
59
+ value: "ms-auto shrink-0 whitespace-nowrap text-default tabular-nums"
60
+ },
61
+ appUi.value,
62
+ ui
63
+ )
64
+ );
65
+ function lineClass(line) {
66
+ return [
67
+ classes.value.line,
68
+ line.subtotal ? "mt-1 border-t border-muted pt-2 font-semibold" : "",
69
+ line.muted ? "opacity-55" : ""
70
+ ];
71
+ }
72
+ function valueClass(line) {
73
+ return twMerge(
74
+ classes.value.value,
75
+ line.subtotal ? "text-highlighted" : "",
76
+ line.tone ? `${displayToneClass(line.tone)} text-[var(--nut-tone-ink)]` : ""
77
+ );
78
+ }
79
+ </script>
80
+
81
+ <template>
82
+ <DisplaySkeleton
83
+ v-if="loading"
84
+ layout="rows"
85
+ :count="Math.min(Math.max(lines.length + 1, 3), 6)"
86
+ />
87
+ <div v-else data-display="breakdown" :data-mode="mode">
88
+ <div v-if="mode === 'compare'" :class="[classes.root, 'overflow-hidden']">
89
+ <table class="w-full border-collapse">
90
+ <thead :class="classes.header">
91
+ <tr>
92
+ <th :class="classes.headerCell"><DisplayRender :content="title" /></th>
93
+ <th v-for="(column, index) in columns ?? []" :key="index" :class="classes.headerCell">
94
+ <DisplayRender :content="column" />
95
+ </th>
96
+ </tr>
97
+ </thead>
98
+ <tbody>
99
+ <tr v-for="(line, index) in lines" :key="index" class="border-t border-muted">
100
+ <td :class="['px-4 py-2', classes.label]"><DisplayRender :content="line.label" /></td>
101
+ <td
102
+ v-for="(cell, cellIndex) in line.values ?? []"
103
+ :key="cellIndex"
104
+ v-reveal-truncated
105
+ :class="['px-4 py-2 text-end', valueClass(line)]"
106
+ >
107
+ <DisplayRender :content="cell" />
108
+ </td>
109
+ </tr>
110
+ <tr v-if="total" class="border-t border-dashed border-accented">
111
+ <td :class="['px-4 py-2.5', classes.totalLabel]">
112
+ <DisplayRender :content="total.label" />
113
+ </td>
114
+ <td
115
+ v-for="(cell, cellIndex) in total.values ?? []"
116
+ :key="cellIndex"
117
+ :class="['px-4 py-2.5 text-end', classes.totalValue, 'text-base']"
118
+ >
119
+ <DisplayRender :content="cell" />
120
+ </td>
121
+ </tr>
122
+ </tbody>
123
+ </table>
124
+ </div>
125
+ <div v-else-if="mode === 'collapsible'" :class="classes.root">
126
+ <div :class="classes.total">
127
+ <span v-reveal-truncated :class="classes.totalLabel">
128
+ <DisplayRender :content="total?.label ?? title" />
129
+ <DisplayChip v-if="total?.chip" :chip="total.chip" />
130
+ </span>
131
+ <button type="button" :class="classes.toggle" :aria-expanded="open" @click="open = !open">
132
+ {{ t("display.details") }}
133
+ <UIcon
134
+ :name="icons.chevronDown"
135
+ class="size-3.5 transition-transform"
136
+ :class="open ? 'rotate-180' : ''"
137
+ />
138
+ </button>
139
+ <span :class="['ms-auto', classes.totalValue]"
140
+ ><DisplayRender :content="total?.value"
141
+ /></span>
142
+ </div>
143
+ <div v-if="open" :class="classes.body">
144
+ <div v-for="(line, index) in lines" :key="index" :class="lineClass(line)">
145
+ <span v-reveal-truncated :class="classes.label">
146
+ <DisplayRender :content="line.label" />
147
+ <span v-if="!isDisplayContentEmpty(line.detail)" :class="classes.detail"
148
+ ><DisplayRender :content="line.detail"
149
+ /></span>
150
+ </span>
151
+ <span v-reveal-truncated :class="valueClass(line)"
152
+ ><DisplayRender :content="line.value"
153
+ /></span>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ <div v-else :class="classes.root">
158
+ <div v-if="!isDisplayContentEmpty(title)" v-reveal-truncated :class="classes.title">
159
+ <DisplayRender :content="title" />
160
+ </div>
161
+ <div v-for="(line, index) in lines" :key="index" :class="lineClass(line)">
162
+ <span v-reveal-truncated :class="classes.label">
163
+ <DisplayRender :content="line.label" />
164
+ <span v-if="!isDisplayContentEmpty(line.detail)" :class="classes.detail"
165
+ ><DisplayRender :content="line.detail"
166
+ /></span>
167
+ </span>
168
+ <span v-reveal-truncated :class="valueClass(line)"
169
+ ><DisplayRender :content="line.value"
170
+ /></span>
171
+ </div>
172
+ <div v-if="total" :class="classes.total">
173
+ <span v-reveal-truncated :class="classes.totalLabel">
174
+ <DisplayRender :content="total.label" />
175
+ <DisplayChip v-if="total.chip" :chip="total.chip" />
176
+ </span>
177
+ <span :class="classes.totalValue"><DisplayRender :content="total.value" /></span>
178
+ </div>
179
+ </div>
180
+ <p v-if="!isDisplayContentEmpty(footnote)" :class="classes.footnote">
181
+ <DisplayRender :content="footnote" />
182
+ </p>
183
+ </div>
184
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayBreakdownProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayBreakdownProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayBreakdownProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import type { DisplayChartProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayChartProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayChartProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;