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
@@ -0,0 +1,154 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { computed } from "vue";
4
+ import { useDisplayAppUi } from "../../composables/use-display-config";
5
+ import { 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 DisplayChip from "../parts/display-chip.vue";
11
+ import DisplayRender from "../parts/display-render";
12
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
13
+ const {
14
+ variant = "inline",
15
+ title = void 0,
16
+ columns = void 0,
17
+ items,
18
+ showUnchanged = false,
19
+ loading = false,
20
+ ui = void 0
21
+ } = defineProps({
22
+ variant: { type: String, required: false },
23
+ title: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
24
+ columns: { type: Array, required: false },
25
+ items: { type: Array, required: true },
26
+ showUnchanged: { type: Boolean, required: false },
27
+ loading: { type: Boolean, required: false },
28
+ ui: { type: Object, required: false }
29
+ });
30
+ const { t } = useDisplayLocale();
31
+ const icons = useDisplayIcons();
32
+ const appUi = useDisplayAppUi("diff");
33
+ const inlineItems = computed(
34
+ () => showUnchanged ? items : items.filter((item) => item.changed !== false)
35
+ );
36
+ const headings = computed(
37
+ () => columns ?? [t("display.field"), t("display.before"), t("display.after")]
38
+ );
39
+ const classes = computed(
40
+ () => resolveDisplayClasses(
41
+ {
42
+ after: "rounded-[4px] bg-[var(--nut-display-success-soft)] px-1.5 py-px font-semibold text-[var(--nut-display-success-ink)]",
43
+ arrow: "size-3.5 shrink-0 text-dimmed",
44
+ before: "rounded-[4px] bg-[var(--nut-display-error-soft)] px-1.5 py-px text-[var(--nut-display-error-ink)] line-through decoration-[color-mix(in_oklab,currentColor_45%,transparent)]",
45
+ cell: "border-t border-muted px-3 py-2 align-middle",
46
+ frame: "overflow-hidden rounded-[var(--nut-display-radius)] border border-default",
47
+ headCell: "bg-elevated px-3 py-2 text-start text-[11px] font-bold tracking-[0.07em] text-muted uppercase",
48
+ item: "",
49
+ label: "mb-1 flex items-center gap-2 text-xs text-muted",
50
+ note: "",
51
+ root: "flex min-w-0 flex-col gap-2.5",
52
+ table: "w-full border-collapse text-sm",
53
+ title: "text-sm font-semibold text-toned",
54
+ unchanged: "text-muted",
55
+ values: "flex flex-wrap items-center gap-1.5 text-sm"
56
+ },
57
+ appUi.value,
58
+ ui
59
+ )
60
+ );
61
+ </script>
62
+
63
+ <template>
64
+ <DisplaySkeleton
65
+ v-if="loading"
66
+ :layout="variant === 'columns' ? 'rows' : 'lines'"
67
+ :count="Math.max(items.length, 2)"
68
+ />
69
+ <div v-else :class="classes.root" data-display="diff" :data-variant="variant">
70
+ <div v-if="!isDisplayContentEmpty(title)" v-reveal-truncated :class="classes.title">
71
+ <DisplayRender :content="title" />
72
+ </div>
73
+ <template v-if="variant === 'inline'">
74
+ <div v-for="(item, index) in inlineItems" :key="index" :class="classes.item">
75
+ <div v-reveal-truncated :class="classes.label">
76
+ <DisplayRender :content="item.label" />
77
+ <DisplayChip v-if="item.note" :chip="item.note" :class="classes.note" />
78
+ </div>
79
+ <div
80
+ v-if="item.changed === false"
81
+ :class="[classes.values, classes.unchanged]"
82
+ data-unchanged
83
+ >
84
+ <DisplayRender :content="isDisplayContentEmpty(item.after) ? item.before : item.after" />
85
+ </div>
86
+ <div v-else :class="classes.values">
87
+ <span
88
+ v-if="!isDisplayContentEmpty(item.before)"
89
+ v-reveal-truncated
90
+ :class="classes.before"
91
+ ><DisplayRender :content="item.before"
92
+ /></span>
93
+ <UIcon
94
+ v-if="!isDisplayContentEmpty(item.before) && !isDisplayContentEmpty(item.after)"
95
+ :name="icons.arrowRight"
96
+ :class="classes.arrow"
97
+ />
98
+ <span v-if="!isDisplayContentEmpty(item.after)" v-reveal-truncated :class="classes.after"
99
+ ><DisplayRender :content="item.after"
100
+ /></span>
101
+ </div>
102
+ </div>
103
+ </template>
104
+ <div v-else :class="classes.frame">
105
+ <table :class="classes.table">
106
+ <thead>
107
+ <tr>
108
+ <th
109
+ v-for="(heading, index) in headings"
110
+ :key="index"
111
+ scope="col"
112
+ v-reveal-truncated
113
+ :class="classes.headCell"
114
+ >
115
+ <DisplayRender :content="heading" />
116
+ </th>
117
+ </tr>
118
+ </thead>
119
+ <tbody>
120
+ <tr
121
+ v-for="(item, index) in items"
122
+ :key="index"
123
+ :class="item.changed === false ? 'text-dimmed' : ''"
124
+ :data-changed="item.changed !== false"
125
+ >
126
+ <td
127
+ v-reveal-truncated
128
+ :class="[classes.cell, item.changed === false ? '' : 'text-toned']"
129
+ >
130
+ <span class="inline-flex flex-wrap items-center gap-1.5">
131
+ <DisplayRender :content="item.label" />
132
+ <DisplayChip v-if="item.note" :chip="item.note" :class="classes.note" />
133
+ </span>
134
+ </td>
135
+ <td
136
+ v-reveal-truncated
137
+ :class="[classes.cell, item.changed === false ? '' : 'text-muted']"
138
+ >
139
+ <DisplayRender :content="item.before" />
140
+ </td>
141
+ <td
142
+ :class="[
143
+ classes.cell,
144
+ item.changed === false ? '' : 'font-semibold text-highlighted'
145
+ ]"
146
+ >
147
+ <DisplayRender :content="item.after" />
148
+ </td>
149
+ </tr>
150
+ </tbody>
151
+ </table>
152
+ </div>
153
+ </div>
154
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayDiffProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayDiffProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayDiffProps> & 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 { DisplayEmptyProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayEmptyProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayEmptyProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,75 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { computed } from "vue";
4
+ import { useDisplayAppUi } from "../../composables/use-display-config";
5
+ import { 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
+ variant = "dashed",
16
+ icon = void 0,
17
+ title = void 0,
18
+ description = void 0,
19
+ actions = void 0,
20
+ tone = "neutral",
21
+ loading = false,
22
+ ui = void 0
23
+ } = defineProps({
24
+ variant: { type: String, required: false },
25
+ icon: { type: String, required: false },
26
+ title: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
27
+ description: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
28
+ actions: { type: Array, required: false },
29
+ tone: { type: String, required: false },
30
+ loading: { type: Boolean, required: false },
31
+ ui: { type: Object, required: false }
32
+ });
33
+ const { t } = useDisplayLocale();
34
+ const icons = useDisplayIcons();
35
+ const appUi = useDisplayAppUi("empty");
36
+ const classes = computed(
37
+ () => resolveDisplayClasses(
38
+ variant === "plain" ? {
39
+ actions: "ms-auto flex gap-1.5",
40
+ description: "text-dimmed",
41
+ icon: "size-4 shrink-0",
42
+ root: "flex items-center gap-2 py-1.5 text-sm text-dimmed",
43
+ title: ""
44
+ } : {
45
+ actions: "mt-3 flex flex-wrap justify-center gap-2",
46
+ description: "max-w-sm text-sm text-muted",
47
+ icon: "mb-2 grid size-10 place-items-center rounded-[var(--nut-display-radius)] bg-[var(--nut-tone-soft)] text-[var(--nut-tone-ink)]",
48
+ root: "flex flex-col items-center gap-1 rounded-[var(--nut-display-radius)] border-[1.5px] border-dashed border-accented px-5 py-6 text-center",
49
+ title: "text-sm font-semibold text-highlighted"
50
+ },
51
+ appUi.value,
52
+ ui
53
+ )
54
+ );
55
+ </script>
56
+
57
+ <template>
58
+ <DisplaySkeleton v-if="loading" layout="block" />
59
+ <div
60
+ v-else
61
+ :class="[classes.root, displayToneClass(tone)]"
62
+ data-display="empty"
63
+ :data-variant="variant"
64
+ >
65
+ <UIcon v-if="variant === 'plain'" :name="icon ?? icons.empty" :class="classes.icon" />
66
+ <span v-else :class="classes.icon"><UIcon :name="icon ?? icons.empty" class="size-5" /></span>
67
+ <div v-reveal-truncated :class="classes.title">
68
+ <DisplayRender :content="title ?? (variant === 'plain' ? void 0 : t('display.empty'))" />
69
+ </div>
70
+ <div v-if="!isDisplayContentEmpty(description)" v-reveal-truncated :class="classes.description">
71
+ <DisplayRender :content="description" />
72
+ </div>
73
+ <DisplayActions v-if="actions?.length" :actions="actions" :class="classes.actions" />
74
+ </div>
75
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayEmptyProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayEmptyProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayEmptyProps> & 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 { DisplayFactsProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayFactsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayFactsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,195 @@
1
+ <script setup>
2
+ import UIcon from "@nuxt/ui/components/Icon.vue";
3
+ import { twMerge } from "tailwind-merge";
4
+ import { computed } from "vue";
5
+ import { useDisplayAppUi } from "../../composables/use-display-config";
6
+ import { vRevealTruncated } from "../../directives/reveal-truncated";
7
+ import { resolveDisplayClasses } from "../../utils/classes";
8
+ import { isDisplayContentEmpty } from "../../utils/content";
9
+ import {
10
+ DISPLAY_SURFACE_CLASSES,
11
+ DISPLAY_SURFACE_PADDING,
12
+ displayToneClass
13
+ } from "../../utils/tone";
14
+ import DisplayActions from "../parts/display-actions.vue";
15
+ import DisplayEmptyLine from "../parts/display-empty-line.vue";
16
+ import DisplayFactValue from "../parts/display-fact-value.vue";
17
+ import DisplayRender from "../parts/display-render";
18
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
19
+ const {
20
+ layout = "ledger",
21
+ surface = void 0,
22
+ items = void 0,
23
+ groups = void 0,
24
+ columns = void 0,
25
+ labelWidth = "8rem",
26
+ empty = void 0,
27
+ actions = void 0,
28
+ loading = false,
29
+ ui = void 0
30
+ } = defineProps({
31
+ layout: { type: String, required: false },
32
+ surface: { type: String, required: false },
33
+ items: { type: Array, required: false },
34
+ groups: { type: Array, required: false },
35
+ columns: { type: Number, required: false },
36
+ labelWidth: { type: String, required: false },
37
+ empty: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
38
+ actions: { type: Array, required: false },
39
+ loading: { type: Boolean, required: false },
40
+ ui: { type: Object, required: false }
41
+ });
42
+ const CAPTION = "text-[11px] font-bold tracking-[0.07em] text-muted uppercase";
43
+ const LABEL_CLASSES = {
44
+ columns: "flex min-w-0 items-center gap-1.5 text-muted",
45
+ grid: `flex min-w-0 items-center gap-1.5 ${CAPTION}`,
46
+ inline: "inline-flex items-center gap-1.5 text-muted",
47
+ ledger: "flex min-w-0 items-center gap-1.5 text-muted",
48
+ tiles: `flex min-w-0 items-center gap-1.5 ${CAPTION}`
49
+ };
50
+ const VALUE_CLASSES = {
51
+ columns: "flex min-w-0 flex-wrap items-center gap-1.5 font-medium text-default [overflow-wrap:anywhere]",
52
+ grid: "flex min-h-5 min-w-0 flex-wrap items-center gap-1.5 font-semibold text-highlighted [overflow-wrap:anywhere]",
53
+ inline: "inline-flex items-center gap-1 font-bold text-highlighted tabular-nums",
54
+ ledger: "ms-auto flex min-w-0 flex-wrap items-center justify-end gap-1.5 text-end font-semibold text-highlighted tabular-nums [overflow-wrap:anywhere]",
55
+ tiles: "flex min-w-0 flex-wrap items-center gap-1.5 text-lg font-extrabold text-highlighted tabular-nums"
56
+ };
57
+ const ITEM_CLASSES = {
58
+ columns: "contents",
59
+ grid: "flex min-w-0 flex-col gap-1",
60
+ inline: "inline-flex min-w-0 items-baseline gap-1.5",
61
+ ledger: "flex flex-wrap items-center justify-between gap-x-4 gap-y-1 border-t border-muted py-2.5 first:border-t-0",
62
+ tiles: "flex min-w-0 flex-col gap-1 rounded-[var(--nut-display-radius)] bg-elevated px-3 py-2.5"
63
+ };
64
+ const GROUP_CLASSES = {
65
+ columns: "grid min-w-0 gap-x-4 gap-y-2.5 text-sm",
66
+ grid: "grid min-w-0 gap-x-5 gap-y-4 text-sm",
67
+ inline: "flex min-w-0 flex-wrap gap-x-4.5 gap-y-1.5 text-sm",
68
+ ledger: "",
69
+ tiles: "grid min-w-0 gap-2 text-sm"
70
+ };
71
+ const appUi = useDisplayAppUi("facts");
72
+ const resolvedSurface = computed(() => surface ?? (layout === "ledger" ? "bordered" : "plain"));
73
+ const resolvedGroups = computed(() => groups ?? [{ items: items ?? [] }]);
74
+ const count = computed(
75
+ () => resolvedGroups.value.reduce((total, group) => total + group.items.length, 0)
76
+ );
77
+ const boxed = computed(() => resolvedSurface.value !== "plain");
78
+ const groupStyle = computed(() => {
79
+ if (layout === "columns") return { gridTemplateColumns: `${labelWidth} minmax(0, 1fr)` };
80
+ if (layout !== "grid" && layout !== "tiles") return void 0;
81
+ return {
82
+ gridTemplateColumns: columns ? `repeat(${columns}, minmax(0, 1fr))` : `repeat(auto-fill, minmax(${layout === "grid" ? "9rem" : "8rem"}, 1fr))`
83
+ };
84
+ });
85
+ const classes = computed(
86
+ () => resolveDisplayClasses(
87
+ {
88
+ actions: "mt-2.5 flex flex-wrap gap-2",
89
+ empty: "",
90
+ group: GROUP_CLASSES[layout],
91
+ groupAside: "text-xs font-medium text-toned normal-case tracking-normal",
92
+ groupHeader: layout === "ledger" ? `flex items-baseline justify-between gap-3 border-t border-default py-1.5 first:border-t-0 ${boxed.value ? "bg-elevated" : ""} ${CAPTION}` : `mb-2 flex items-baseline justify-between gap-3 ${CAPTION}`,
93
+ groupTitle: "",
94
+ hint: layout === "ledger" ? "text-xs text-dimmed" : "text-xs text-muted",
95
+ item: ITEM_CLASSES[layout],
96
+ label: LABEL_CLASSES[layout],
97
+ root: layout === "ledger" ? `flex min-w-0 flex-col overflow-hidden text-sm ${DISPLAY_SURFACE_CLASSES[resolvedSurface.value]} ${boxed.value ? "[&>*]:px-4" : ""}` : `flex min-w-0 flex-col gap-4 ${DISPLAY_SURFACE_CLASSES[resolvedSurface.value]} ${DISPLAY_SURFACE_PADDING[resolvedSurface.value]}`,
98
+ value: VALUE_CLASSES[layout]
99
+ },
100
+ appUi.value,
101
+ ui
102
+ )
103
+ );
104
+ function valueClass(fact) {
105
+ return twMerge(
106
+ classes.value.value,
107
+ fact.tone ? `${displayToneClass(fact.tone)} text-[var(--nut-tone-ink)]` : "",
108
+ fact.emphasis ? "text-lg font-extrabold" : "",
109
+ fact.mono ? "font-mono text-[13px] font-medium" : ""
110
+ );
111
+ }
112
+ </script>
113
+
114
+ <template>
115
+ <DisplaySkeleton
116
+ v-if="loading"
117
+ :layout="layout === 'ledger' ? 'rows' : layout === 'tiles' ? 'tiles' : 'lines'"
118
+ :count="Math.min(Math.max(count, 2), 5)"
119
+ />
120
+ <DisplayEmptyLine v-else-if="!count" :content="empty" :class="classes.empty" />
121
+ <div
122
+ v-else-if="layout === 'ledger'"
123
+ :class="classes.root"
124
+ data-display="facts"
125
+ data-layout="ledger"
126
+ >
127
+ <template v-for="(group, groupIndex) in resolvedGroups" :key="groupIndex">
128
+ <div v-if="!isDisplayContentEmpty(group.title)" :class="classes.groupHeader">
129
+ <span v-reveal-truncated :class="classes.groupTitle"
130
+ ><DisplayRender :content="group.title"
131
+ /></span>
132
+ <span
133
+ v-if="!isDisplayContentEmpty(group.aside)"
134
+ v-reveal-truncated
135
+ :class="classes.groupAside"
136
+ >
137
+ <DisplayRender :content="group.aside" />
138
+ </span>
139
+ </div>
140
+ <div v-for="(fact, index) in group.items" :key="index" :class="classes.item">
141
+ <div class="flex min-w-0 flex-col gap-px">
142
+ <span v-reveal-truncated :class="classes.label">
143
+ <UIcon v-if="fact.icon" :name="fact.icon" class="size-3.5 shrink-0" />
144
+ <DisplayRender :content="fact.label" />
145
+ </span>
146
+ <span v-if="!isDisplayContentEmpty(fact.hint)" v-reveal-truncated :class="classes.hint">
147
+ <DisplayRender :content="fact.hint" />
148
+ </span>
149
+ </div>
150
+ <div v-reveal-truncated :class="valueClass(fact)" data-display-value>
151
+ <DisplayFactValue :fact="fact" />
152
+ </div>
153
+ </div>
154
+ </template>
155
+ </div>
156
+ <div v-else :class="classes.root" data-display="facts" :data-layout="layout">
157
+ <div v-for="(group, groupIndex) in resolvedGroups" :key="groupIndex">
158
+ <div v-if="!isDisplayContentEmpty(group.title)" :class="classes.groupHeader">
159
+ <span v-reveal-truncated :class="classes.groupTitle"
160
+ ><DisplayRender :content="group.title"
161
+ /></span>
162
+ <span
163
+ v-if="!isDisplayContentEmpty(group.aside)"
164
+ v-reveal-truncated
165
+ :class="classes.groupAside"
166
+ >
167
+ <DisplayRender :content="group.aside" />
168
+ </span>
169
+ </div>
170
+ <dl :class="['m-0', classes.group]" :style="groupStyle">
171
+ <div v-for="(fact, index) in group.items" :key="index" :class="classes.item">
172
+ <dt v-reveal-truncated :class="classes.label">
173
+ <UIcon v-if="fact.icon" :name="fact.icon" class="size-3.5 shrink-0" />
174
+ <DisplayRender :content="fact.label" />
175
+ </dt>
176
+ <dd v-reveal-truncated :class="['m-0', valueClass(fact)]" data-display-value>
177
+ <DisplayFactValue :fact="fact" />
178
+ </dd>
179
+ <dd
180
+ v-if="layout !== 'inline' && !isDisplayContentEmpty(fact.hint)"
181
+ :class="['m-0', classes.hint, layout === 'columns' ? 'col-start-2 -mt-2' : '']"
182
+ >
183
+ <DisplayRender :content="fact.hint" />
184
+ </dd>
185
+ </div>
186
+ </dl>
187
+ </div>
188
+ </div>
189
+ <DisplayActions
190
+ v-if="!loading && actions?.length"
191
+ :actions="actions"
192
+ :class="classes.actions"
193
+ data-display-actions
194
+ />
195
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayFactsProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayFactsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayFactsProps> & 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 { DisplayHeadingProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayHeadingProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayHeadingProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,103 @@
1
+ <script setup>
2
+ import UButton from "@nuxt/ui/components/Button.vue";
3
+ import UIcon from "@nuxt/ui/components/Icon.vue";
4
+ import { computed } from "vue";
5
+ import { useDisplayAppUi } from "../../composables/use-display-config";
6
+ import { vRevealTruncated } from "../../directives/reveal-truncated";
7
+ import { resolveDisplayClasses } from "../../utils/classes";
8
+ import { isDisplayContentEmpty, resolveDisplayText } from "../../utils/content";
9
+ import { isExternalLink } from "../../utils/links";
10
+ import { displayToneClass } from "../../utils/tone";
11
+ import DisplayRender from "../parts/display-render";
12
+ import DisplaySkeleton from "../parts/display-skeleton.vue";
13
+ const {
14
+ title,
15
+ description = void 0,
16
+ variant = "title",
17
+ size = "md",
18
+ icon = void 0,
19
+ tone = "primary",
20
+ count = void 0,
21
+ action = void 0,
22
+ level = 3,
23
+ loading = false,
24
+ ui = void 0
25
+ } = defineProps({
26
+ title: { type: [String, Number, Function, Object, Boolean, null, Array], required: true, skipCheck: true },
27
+ description: { type: [String, Number, Function, Object, Boolean, null, Array], required: false, skipCheck: true },
28
+ variant: { type: String, required: false },
29
+ size: { type: String, required: false },
30
+ icon: { type: String, required: false },
31
+ tone: { type: String, required: false },
32
+ count: { type: [String, Number, Function], required: false },
33
+ action: { type: Object, required: false },
34
+ level: { type: Number, required: false },
35
+ loading: { type: Boolean, required: false },
36
+ ui: { type: Object, required: false }
37
+ });
38
+ const TITLE_CLASSES = {
39
+ lg: "text-base font-semibold text-highlighted",
40
+ md: "text-[15px] font-semibold text-highlighted",
41
+ sm: "text-sm font-semibold text-highlighted"
42
+ };
43
+ const appUi = useDisplayAppUi("heading");
44
+ const tile = computed(() => size === "lg" && Boolean(icon));
45
+ const classes = computed(
46
+ () => resolveDisplayClasses(
47
+ {
48
+ action: "ms-auto shrink-0",
49
+ count: "rounded-full bg-elevated px-2 py-px text-xs font-semibold text-toned tabular-nums",
50
+ description: "mt-0.5 text-sm text-muted",
51
+ icon: tile.value ? "grid size-10 shrink-0 place-items-center rounded-[var(--nut-display-radius)] bg-[var(--nut-tone-soft)] text-[var(--nut-tone-ink)]" : "size-4.5 shrink-0 text-muted",
52
+ root: variant === "eyebrow" ? "flex items-center gap-3" : tile.value || !isDisplayContentEmpty(description) ? "flex items-start gap-3" : "flex items-center gap-2",
53
+ rule: "h-px flex-1 bg-[var(--ui-border)]",
54
+ text: "flex min-w-0 flex-1 flex-col",
55
+ title: variant === "eyebrow" ? "m-0 text-[11px] font-bold tracking-[0.08em] text-muted uppercase" : `m-0 flex flex-wrap items-center gap-2 ${TITLE_CLASSES[size]}`
56
+ },
57
+ appUi.value,
58
+ ui
59
+ )
60
+ );
61
+ const actionButton = computed(() => {
62
+ if (!action) return void 0;
63
+ const { label, ...rest } = action;
64
+ return {
65
+ color: "primary",
66
+ size: "sm",
67
+ variant: "link",
68
+ ...rest,
69
+ label: resolveDisplayText(label),
70
+ target: rest.target === void 0 && isExternalLink(rest.to) ? "_blank" : rest.target
71
+ };
72
+ });
73
+ </script>
74
+
75
+ <template>
76
+ <DisplaySkeleton v-if="loading" :count="isDisplayContentEmpty(description) ? 1 : 2" />
77
+ <div v-else-if="variant === 'eyebrow'" :class="classes.root" data-display="heading">
78
+ <component :is="`h${level}`" :class="classes.title">
79
+ <DisplayRender :content="title" />
80
+ </component>
81
+ <span :class="classes.rule" aria-hidden="true" />
82
+ </div>
83
+ <div v-else :class="[classes.root, displayToneClass(tone)]" data-display="heading">
84
+ <span v-if="tile" :class="classes.icon"><UIcon :name="icon ?? ''" class="size-5" /></span>
85
+ <UIcon v-else-if="icon" :name="icon" :class="classes.icon" />
86
+ <div v-reveal-truncated :class="classes.text">
87
+ <component :is="`h${level}`" :class="classes.title">
88
+ <DisplayRender :content="title" />
89
+ <span v-if="count !== void 0" :class="classes.count">{{
90
+ resolveDisplayText(count)
91
+ }}</span>
92
+ </component>
93
+ <div
94
+ v-if="!isDisplayContentEmpty(description)"
95
+ v-reveal-truncated
96
+ :class="classes.description"
97
+ >
98
+ <DisplayRender :content="description" />
99
+ </div>
100
+ </div>
101
+ <UButton v-if="actionButton" v-bind="actionButton" :class="classes.action" />
102
+ </div>
103
+ </template>
@@ -0,0 +1,4 @@
1
+ import type { DisplayHeadingProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayHeadingProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayHeadingProps> & 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 { DisplayListProps } from '../../types/index.js';
2
+ declare const __VLS_export: import("vue").DefineComponent<DisplayListProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DisplayListProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;