@revenexx/studio-shared 0.3.3 → 0.4.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 (205) hide show
  1. package/dist/module.d.mts +7 -3
  2. package/dist/module.json +2 -2
  3. package/dist/module.mjs +10 -4
  4. package/dist/runtime/components/Dashboard/DashboardConfirmDialog.d.vue.ts +2 -1
  5. package/dist/runtime/components/Dashboard/DashboardConfirmDialog.vue +1 -1
  6. package/dist/runtime/components/Dashboard/DashboardConfirmDialog.vue.d.ts +2 -1
  7. package/dist/runtime/components/Dashboard/DashboardControls.d.vue.ts +8 -7
  8. package/dist/runtime/components/Dashboard/DashboardControls.vue.d.ts +8 -7
  9. package/dist/runtime/components/Dashboard/DashboardGrid.d.vue.ts +2 -1
  10. package/dist/runtime/components/Dashboard/DashboardGrid.vue +45 -1
  11. package/dist/runtime/components/Dashboard/DashboardGrid.vue.d.ts +2 -1
  12. package/dist/runtime/components/Dashboard/DashboardNameDialog.d.vue.ts +2 -1
  13. package/dist/runtime/components/Dashboard/DashboardNameDialog.vue +1 -1
  14. package/dist/runtime/components/Dashboard/DashboardNameDialog.vue.d.ts +2 -1
  15. package/dist/runtime/components/Dashboard/DashboardPickerDialog.d.vue.ts +2 -1
  16. package/dist/runtime/components/Dashboard/DashboardPickerDialog.vue +1 -1
  17. package/dist/runtime/components/Dashboard/DashboardPickerDialog.vue.d.ts +2 -1
  18. package/dist/runtime/components/Dashboard/DashboardShareDialog.d.vue.ts +2 -1
  19. package/dist/runtime/components/Dashboard/DashboardShareDialog.vue +1 -1
  20. package/dist/runtime/components/Dashboard/DashboardShareDialog.vue.d.ts +2 -1
  21. package/dist/runtime/components/Dashboard/DashboardTopBar.d.vue.ts +9 -4
  22. package/dist/runtime/components/Dashboard/DashboardTopBar.vue.d.ts +9 -4
  23. package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.d.vue.ts +8 -6
  24. package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.vue +1 -1
  25. package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.vue.d.ts +8 -6
  26. package/dist/runtime/components/Dashboard/DashboardWidgetFrame.d.vue.ts +5 -4
  27. package/dist/runtime/components/Dashboard/DashboardWidgetFrame.vue +14 -3
  28. package/dist/runtime/components/Dashboard/DashboardWidgetFrame.vue.d.ts +5 -4
  29. package/dist/runtime/components/Dashboard/DashboardWidgetHost.d.vue.ts +2 -1
  30. package/dist/runtime/components/Dashboard/DashboardWidgetHost.vue.d.ts +2 -1
  31. package/dist/runtime/components/Dashboard/DashboardWidgetIcon.d.vue.ts +2 -1
  32. package/dist/runtime/components/Dashboard/DashboardWidgetIcon.vue.d.ts +2 -1
  33. package/dist/runtime/components/Dashboard/DashboardWidgetLibrary.d.vue.ts +2 -1
  34. package/dist/runtime/components/Dashboard/DashboardWidgetLibrary.vue.d.ts +2 -1
  35. package/dist/runtime/components/Dashboard/DashboardWidgetPreview.d.vue.ts +2 -1
  36. package/dist/runtime/components/Dashboard/DashboardWidgetPreview.vue.d.ts +2 -1
  37. package/dist/runtime/components/DataTable/ColumnsMenu.d.vue.ts +2 -1
  38. package/dist/runtime/components/DataTable/ColumnsMenu.vue.d.ts +2 -1
  39. package/dist/runtime/components/DataTable/DataTable.d.vue.ts +120 -37
  40. package/dist/runtime/components/DataTable/DataTable.vue +493 -53
  41. package/dist/runtime/components/DataTable/DataTable.vue.d.ts +120 -37
  42. package/dist/runtime/components/DataTable/FacetChips.d.vue.ts +2 -1
  43. package/dist/runtime/components/DataTable/FacetChips.vue.d.ts +2 -1
  44. package/dist/runtime/components/DataTable/FacetPanel.d.vue.ts +6 -5
  45. package/dist/runtime/components/DataTable/FacetPanel.vue +57 -8
  46. package/dist/runtime/components/DataTable/FacetPanel.vue.d.ts +6 -5
  47. package/dist/runtime/components/DataTable/FilterMenu.d.vue.ts +6 -5
  48. package/dist/runtime/components/DataTable/FilterMenu.vue +5 -5
  49. package/dist/runtime/components/DataTable/FilterMenu.vue.d.ts +6 -5
  50. package/dist/runtime/components/DataTable/SavedViewsMenu.d.vue.ts +2 -1
  51. package/dist/runtime/components/DataTable/SavedViewsMenu.vue +61 -12
  52. package/dist/runtime/components/DataTable/SavedViewsMenu.vue.d.ts +2 -1
  53. package/dist/runtime/components/DataTable/SortMenu.d.vue.ts +4 -2
  54. package/dist/runtime/components/DataTable/SortMenu.vue +4 -1
  55. package/dist/runtime/components/DataTable/SortMenu.vue.d.ts +4 -2
  56. package/dist/runtime/components/DataTable/ToolbarLabelTrigger.d.vue.ts +23 -0
  57. package/dist/runtime/components/DataTable/ToolbarLabelTrigger.vue +29 -0
  58. package/dist/runtime/components/DataTable/ToolbarLabelTrigger.vue.d.ts +23 -0
  59. package/dist/runtime/components/DataTable/ViewModeSwitch.d.vue.ts +4 -2
  60. package/dist/runtime/components/DataTable/ViewModeSwitch.vue.d.ts +4 -2
  61. package/dist/runtime/components/DataTable/types.d.ts +17 -0
  62. package/dist/runtime/components/Form/FieldCell.d.vue.ts +32 -0
  63. package/dist/runtime/components/Form/FieldCell.vue +46 -0
  64. package/dist/runtime/components/Form/FieldCell.vue.d.ts +32 -0
  65. package/dist/runtime/components/Form/FieldGrid.d.vue.ts +13 -0
  66. package/dist/runtime/components/Form/FieldGrid.vue +11 -0
  67. package/dist/runtime/components/Form/FieldGrid.vue.d.ts +13 -0
  68. package/dist/runtime/components/Form/FormContextCard.d.vue.ts +33 -0
  69. package/dist/runtime/components/Form/FormContextCard.vue +56 -0
  70. package/dist/runtime/components/Form/FormContextCard.vue.d.ts +33 -0
  71. package/dist/runtime/components/Form/FormLayout.d.vue.ts +47 -0
  72. package/dist/runtime/components/Form/FormLayout.vue +169 -0
  73. package/dist/runtime/components/Form/FormLayout.vue.d.ts +47 -0
  74. package/dist/runtime/components/Form/FormSection.d.vue.ts +25 -0
  75. package/dist/runtime/components/Form/FormSection.vue +48 -0
  76. package/dist/runtime/components/Form/FormSection.vue.d.ts +25 -0
  77. package/dist/runtime/components/Form/SaveBar.d.vue.ts +44 -0
  78. package/dist/runtime/components/Form/SaveBar.vue +71 -0
  79. package/dist/runtime/components/Form/SaveBar.vue.d.ts +44 -0
  80. package/dist/runtime/components/Media/MediaFolderTree.d.vue.ts +6 -5
  81. package/dist/runtime/components/Media/MediaFolderTree.vue +1 -2
  82. package/dist/runtime/components/Media/MediaFolderTree.vue.d.ts +6 -5
  83. package/dist/runtime/components/Media/MediaPickerDialog.d.vue.ts +13 -1
  84. package/dist/runtime/components/Media/MediaPickerDialog.vue +206 -54
  85. package/dist/runtime/components/Media/MediaPickerDialog.vue.d.ts +13 -1
  86. package/dist/runtime/components/Media/MediaUploader.d.vue.ts +2 -1
  87. package/dist/runtime/components/Media/MediaUploader.vue +1 -1
  88. package/dist/runtime/components/Media/MediaUploader.vue.d.ts +2 -1
  89. package/dist/runtime/components/Shared/AppIcon.d.vue.ts +21 -0
  90. package/dist/runtime/components/Shared/AppIcon.vue +47 -0
  91. package/dist/runtime/components/Shared/AppIcon.vue.d.ts +21 -0
  92. package/dist/runtime/components/Shared/BuildLogsFlyout.d.vue.ts +2 -1
  93. package/dist/runtime/components/Shared/BuildLogsFlyout.vue.d.ts +2 -1
  94. package/dist/runtime/components/Shared/CardSizeToggle.d.vue.ts +11 -0
  95. package/dist/runtime/components/Shared/CardSizeToggle.vue +19 -0
  96. package/dist/runtime/components/Shared/CardSizeToggle.vue.d.ts +11 -0
  97. package/dist/runtime/components/Shared/DetailSheet.d.vue.ts +60 -0
  98. package/dist/runtime/components/Shared/DetailSheet.vue +211 -0
  99. package/dist/runtime/components/Shared/DetailSheet.vue.d.ts +60 -0
  100. package/dist/runtime/components/Shared/EmptyNote.d.vue.ts +19 -0
  101. package/dist/runtime/components/Shared/EmptyNote.vue +25 -0
  102. package/dist/runtime/components/Shared/EmptyNote.vue.d.ts +19 -0
  103. package/dist/runtime/components/Shared/FloatingPanel.d.vue.ts +7 -6
  104. package/dist/runtime/components/Shared/FloatingPanel.vue.d.ts +7 -6
  105. package/dist/runtime/components/Shared/GitDeploymentSettings.d.vue.ts +2 -1
  106. package/dist/runtime/components/Shared/GitDeploymentSettings.vue.d.ts +2 -1
  107. package/dist/runtime/components/Shared/KpiTile.d.vue.ts +8 -1
  108. package/dist/runtime/components/Shared/KpiTile.vue +10 -9
  109. package/dist/runtime/components/Shared/KpiTile.vue.d.ts +8 -1
  110. package/dist/runtime/components/Shared/ListSurface.d.vue.ts +3 -2
  111. package/dist/runtime/components/Shared/ListSurface.vue.d.ts +3 -2
  112. package/dist/runtime/components/Shared/PageHeader.d.vue.ts +7 -6
  113. package/dist/runtime/components/Shared/PageHeader.vue +15 -4
  114. package/dist/runtime/components/Shared/PageHeader.vue.d.ts +7 -6
  115. package/dist/runtime/components/Shared/RecordLayout.d.vue.ts +8 -7
  116. package/dist/runtime/components/Shared/RecordLayout.vue +1 -2
  117. package/dist/runtime/components/Shared/RecordLayout.vue.d.ts +8 -7
  118. package/dist/runtime/components/Shared/RecordRailCard.d.vue.ts +3 -2
  119. package/dist/runtime/components/Shared/RecordRailCard.vue +3 -3
  120. package/dist/runtime/components/Shared/RecordRailCard.vue.d.ts +3 -2
  121. package/dist/runtime/components/Shared/SelectionBar.d.vue.ts +22 -0
  122. package/dist/runtime/components/Shared/SelectionBar.vue +40 -0
  123. package/dist/runtime/components/Shared/SelectionBar.vue.d.ts +22 -0
  124. package/dist/runtime/components/Shared/SidebarNav.d.vue.ts +39 -4
  125. package/dist/runtime/components/Shared/SidebarNav.vue +71 -25
  126. package/dist/runtime/components/Shared/SidebarNav.vue.d.ts +39 -4
  127. package/dist/runtime/components/Shared/SidebarNavAreas.d.vue.ts +7 -0
  128. package/dist/runtime/components/Shared/SidebarNavAreas.vue +291 -0
  129. package/dist/runtime/components/Shared/SidebarNavAreas.vue.d.ts +7 -0
  130. package/dist/runtime/components/Shared/SidebarNavLink.d.vue.ts +3 -10
  131. package/dist/runtime/components/Shared/SidebarNavLink.vue +31 -5
  132. package/dist/runtime/components/Shared/SidebarNavLink.vue.d.ts +3 -10
  133. package/dist/runtime/components/Shared/SortHeader.d.vue.ts +3 -2
  134. package/dist/runtime/components/Shared/SortHeader.vue +6 -2
  135. package/dist/runtime/components/Shared/SortHeader.vue.d.ts +3 -2
  136. package/dist/runtime/components/Shared/StateCard.d.vue.ts +6 -5
  137. package/dist/runtime/components/Shared/StateCard.vue +1 -1
  138. package/dist/runtime/components/Shared/StateCard.vue.d.ts +6 -5
  139. package/dist/runtime/components/Shared/StudioCard.d.vue.ts +5 -4
  140. package/dist/runtime/components/Shared/StudioCard.vue.d.ts +5 -4
  141. package/dist/runtime/components/Shared/TabBar.d.vue.ts +4 -21
  142. package/dist/runtime/components/Shared/TabBar.vue +30 -13
  143. package/dist/runtime/components/Shared/TabBar.vue.d.ts +4 -21
  144. package/dist/runtime/components/Shared/ViewTab.d.vue.ts +2 -1
  145. package/dist/runtime/components/Shared/ViewTab.vue.d.ts +2 -1
  146. package/dist/runtime/components/Shared/Wizard.d.vue.ts +20 -7
  147. package/dist/runtime/components/Shared/Wizard.vue +9 -5
  148. package/dist/runtime/components/Shared/Wizard.vue.d.ts +20 -7
  149. package/dist/runtime/composables/useDetailSheet.d.ts +20 -0
  150. package/dist/runtime/composables/useDetailSheet.js +50 -0
  151. package/dist/runtime/composables/useMediaLibrary.d.ts +12 -0
  152. package/dist/runtime/composables/usePlatformTenant.d.ts +6 -0
  153. package/dist/runtime/composables/useSavedViews.d.ts +11 -1
  154. package/dist/runtime/composables/useSavedViews.js +4 -4
  155. package/dist/runtime/composables/useWidgetFigures.d.ts +12 -0
  156. package/dist/runtime/composables/useWidgetFigures.js +24 -0
  157. package/dist/runtime/composables/useWidgetHeader.d.ts +15 -0
  158. package/dist/runtime/composables/useWidgetHeader.js +15 -0
  159. package/dist/runtime/lib/activeTenant.d.ts +58 -0
  160. package/dist/runtime/lib/activeTenant.js +45 -0
  161. package/dist/runtime/lib/appIcon.d.ts +48 -0
  162. package/dist/runtime/lib/appIcon.js +27 -0
  163. package/dist/runtime/lib/auditEnvelope.d.ts +43 -0
  164. package/dist/runtime/lib/auditEnvelope.js +55 -0
  165. package/dist/runtime/lib/cardSize.d.ts +13 -0
  166. package/dist/runtime/lib/cardSize.js +20 -0
  167. package/dist/runtime/lib/dashboardIcons.js +2 -0
  168. package/dist/runtime/lib/dataTableFilters.d.ts +22 -0
  169. package/dist/runtime/lib/dataTableFilters.js +5 -0
  170. package/dist/runtime/lib/detailSheet.d.ts +43 -0
  171. package/dist/runtime/lib/detailSheet.js +34 -0
  172. package/dist/runtime/lib/facets.d.ts +13 -0
  173. package/dist/runtime/lib/formLayout.d.ts +164 -0
  174. package/dist/runtime/lib/formLayout.js +117 -0
  175. package/dist/runtime/lib/formLayoutContext.d.ts +26 -0
  176. package/dist/runtime/lib/formLayoutContext.js +1 -0
  177. package/dist/runtime/lib/gridTracks.d.ts +14 -1
  178. package/dist/runtime/lib/gridTracks.js +13 -2
  179. package/dist/runtime/lib/isoLists.d.ts +37 -2
  180. package/dist/runtime/lib/isoLists.js +54 -1
  181. package/dist/runtime/lib/notice.d.ts +14 -0
  182. package/dist/runtime/lib/notice.js +19 -0
  183. package/dist/runtime/lib/pageSize.d.ts +15 -0
  184. package/dist/runtime/lib/pageSize.js +26 -0
  185. package/dist/runtime/lib/rowMove.d.ts +38 -0
  186. package/dist/runtime/lib/rowMove.js +20 -0
  187. package/dist/runtime/lib/sidebarAreas.d.ts +46 -0
  188. package/dist/runtime/lib/sidebarAreas.js +25 -0
  189. package/dist/runtime/lib/sidebarNav.d.ts +21 -2
  190. package/dist/runtime/lib/sidebarNav.js +23 -4
  191. package/dist/runtime/lib/solarIconMap.d.ts +16 -0
  192. package/dist/runtime/lib/solarIconMap.js +326 -0
  193. package/dist/runtime/lib/solarIcons.d.ts +37 -0
  194. package/dist/runtime/lib/solarIcons.js +25 -0
  195. package/dist/runtime/lib/swipeToClose.d.ts +25 -0
  196. package/dist/runtime/lib/swipeToClose.js +118 -0
  197. package/dist/runtime/lib/tableExport.d.ts +31 -0
  198. package/dist/runtime/lib/tableExport.js +143 -0
  199. package/dist/runtime/lib/talkback.d.ts +5 -0
  200. package/dist/runtime/lib/talkback.js +8 -0
  201. package/dist/runtime/lib/talkbackTokenBatch.d.ts +35 -0
  202. package/dist/runtime/lib/talkbackTokenBatch.js +101 -0
  203. package/dist/runtime/types/nav.d.ts +9 -0
  204. package/dist/types.d.mts +8 -0
  205. package/package.json +4 -3
@@ -0,0 +1,26 @@
1
+ /**
2
+ * What `FormLayout` shares with the parts inside it (PE-976).
3
+ *
4
+ * `FormSection` registers itself so the navigation is built from the sections
5
+ * actually on the page — their ids and titles, in document order — instead of a
6
+ * second list the page has to keep in step. `SaveBar` reads the grid tracks so
7
+ * its buttons line up under the form column rather than under the nav.
8
+ *
9
+ * Kept out of `components/` so the module's component scan never mistakes it
10
+ * for a component.
11
+ */
12
+ import type { ComputedRef, InjectionKey } from 'vue';
13
+ export interface FormSectionEntry {
14
+ id: string;
15
+ title: string;
16
+ el: () => HTMLElement | null;
17
+ }
18
+ export interface FormLayoutContext {
19
+ register: (entry: FormSectionEntry) => void;
20
+ unregister: (id: string) => void;
21
+ /** Grid classes of the layout row, reused by the save bar. */
22
+ gridClass: ComputedRef<string>;
23
+ navVisible: ComputedRef<boolean>;
24
+ contextVisible: ComputedRef<boolean>;
25
+ }
26
+ export declare const FORM_LAYOUT_KEY: InjectionKey<FormLayoutContext>;
@@ -0,0 +1 @@
1
+ export const FORM_LAYOUT_KEY = Symbol("studio-shared.form-layout");
@@ -26,6 +26,19 @@
26
26
  * more. Below this a column stops being a column and becomes a smear.
27
27
  */
28
28
  export declare const FLEX_TRACK_FLOOR = "120px";
29
+ /**
30
+ * A flexible column's floor that keeps its one-line heading inside the track.
31
+ *
32
+ * A heading stays on one line up to a length (`whitespace-nowrap`); squeezed
33
+ * to the 120px floor, „Was es bedeutet“ with its (?) and sort arrow ran into
34
+ * „Aktiv“ beside it (e2e 18.10.). An estimate, not a measurement: about 7.5px
35
+ * per character at the header's text size, plus room for the icons beside it.
36
+ * `undefined` when the plain floor is enough.
37
+ */
38
+ export declare function headerFloor(label: string | undefined | null, opts?: {
39
+ icons?: number;
40
+ maxChars?: number;
41
+ }): string | undefined;
29
42
  /**
30
43
  * One column's declared width, resolved to a track with a floor under it.
31
44
  *
@@ -52,4 +65,4 @@ export declare function trackFor(width: string | undefined | null, floor?: strin
52
65
  * where the manifest put it. On a list without one it is the trailing data
53
66
  * column that grows, which is where the eye is least likely to miss the space.
54
67
  */
55
- export declare function gridTemplateColumns(widths: Array<string | undefined | null>, floor?: string): string;
68
+ export declare function gridTemplateColumns(widths: Array<string | undefined | null>, floor?: string, floors?: Array<string | undefined>): string;
@@ -1,4 +1,10 @@
1
1
  export const FLEX_TRACK_FLOOR = "120px";
2
+ export function headerFloor(label, opts = {}) {
3
+ const text = (label ?? "").trim();
4
+ if (!text || opts.maxChars != null && text.length > opts.maxChars) return void 0;
5
+ const px = Math.ceil(text.length * 7.5) + (opts.icons ?? 0) * 18;
6
+ return px > Number.parseFloat(FLEX_TRACK_FLOOR) ? `${px}px` : void 0;
7
+ }
2
8
  const MINMAX_FR = /^minmax\(\s*[^,]+,\s*([\d.]+fr)\s*\)$/i;
3
9
  const BARE_FR = /^([\d.]+)fr$/i;
4
10
  export function trackFor(width, floor = FLEX_TRACK_FLOOR) {
@@ -18,8 +24,13 @@ function absorbing(track) {
18
24
  const parts = MINMAX.exec(track);
19
25
  return `minmax(${parts ? parts[2] : track},1fr)`;
20
26
  }
21
- export function gridTemplateColumns(widths, floor) {
22
- const tracks = widths.map((w) => trackFor(w, floor));
27
+ export function gridTemplateColumns(widths, floor, floors) {
28
+ const tracks = widths.map((w, i) => {
29
+ const own = floors?.[i];
30
+ const track = trackFor(w, own ?? floor);
31
+ if (own && /^\d+(\.\d+)?px$/.test(track) && Number.parseFloat(track) < Number.parseFloat(own)) return own;
32
+ return track;
33
+ });
23
34
  if (tracks.length === 0) return "";
24
35
  if (!tracks.some(isFlexible)) {
25
36
  const last = tracks.length - 1;
@@ -1,6 +1,6 @@
1
1
  /**
2
- * The two international lists every studio ends up needing: countries
3
- * (ISO 3166-1 alpha-2) and currencies (ISO 4217).
2
+ * The international lists every studio ends up needing: countries
3
+ * (ISO 3166-1 alpha-2), currencies (ISO 4217) and languages (ISO 639-1).
4
4
  *
5
5
  * They live in `studio-shared` rather than in a studio because a country is
6
6
  * not a Commerce concern — Mail wants a sender country, Analytics wants a
@@ -59,3 +59,38 @@ export declare function currencyOptions(locale?: string): IsoOption[];
59
59
  export declare function countryLabel(code: unknown, locale?: string): string;
60
60
  /** `'EUR'` → `'Euro'`. Unknown codes come back unchanged. */
61
61
  export declare function currencyLabel(code: unknown, locale?: string): string;
62
+ /** ISO 639-1, unsorted. Use `languageOptions()` to display them. */
63
+ export declare function languageCodes(): readonly string[];
64
+ /** Every language, sorted by its name in `locale` — „Deutsch“, „Englisch“ … */
65
+ export declare function languageOptions(locale?: string): IsoOption[];
66
+ /** `'de'` → `'Deutsch'`, `'de-AT'` → `'Deutsch (Österreich)'`. Unknown codes come back unchanged. */
67
+ export declare function languageLabel(code: unknown, locale?: string): string;
68
+ /**
69
+ * The circle flag a currency is drawn with (Michael 18.10.: icons in the
70
+ * currency picker, the same round look as the countries). The vendored flag
71
+ * set has no currency symbols, so a currency borrows its issuer's flag: the
72
+ * euro the EU's, every national currency its country's — ISO 4217 codes start
73
+ * with the issuing country (`CHF` → CH, `GBP` → GB). Supranational and special
74
+ * codes (`X…`: CFA franc, gold, SDR) have no single issuer and get the neutral
75
+ * disc. Returns the lowercase slug `CircleFlag` takes.
76
+ */
77
+ export declare function currencyFlag(code: unknown): string;
78
+ /** `'da'` → `'DK'`; null for a language with no single home country. */
79
+ export declare function likelyCountry(language: unknown): string | null;
80
+ /**
81
+ * The circle flag a language or locale is drawn with, as the lowercase slug
82
+ * `CircleFlag` takes: the chosen region when there is one (`de-AT` → `at`),
83
+ * otherwise the language's likely country (`de` → `de`, `en` → `gb`), and
84
+ * `''` when neither exists — the caller then shows its neutral globe.
85
+ */
86
+ export declare function localeFlag(code: unknown): string;
87
+ /**
88
+ * A locale code split into the two choices a picker offers — language and an
89
+ * optional region — and put back together (`de` + `AT` → `de-AT`). Null when
90
+ * the runtime cannot canonicalise it, which is how a nonsense tag is refused.
91
+ */
92
+ export declare function composeLocale(language: string | null | undefined, region?: string | null): string | null;
93
+ export declare function splitLocale(code: unknown): {
94
+ language: string | null;
95
+ region: string | null;
96
+ };
@@ -1,6 +1,9 @@
1
1
  const COUNTRY_CODES = Object.freeze(
2
2
  "AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW".split(" ")
3
3
  );
4
+ const LANGUAGE_CODES = Object.freeze(
5
+ "aa ab ae af ak am an ar as av ay az ba be bg bi bm bn bo br bs ca ce ch co cr cs cu cv cy da de dv dz ee el en eo es et eu fa ff fi fj fo fr fy ga gd gl gn gu gv ha he hi ho hr ht hu hy hz ia id ie ig ii ik io is it iu ja jv ka kg ki kj kk kl km kn ko kr ks ku kv kw ky la lb lg li ln lo lt lu lv mg mh mi mk ml mn mr ms mt my na nb nd ne ng nl nn no nr nv ny oc oj om or os pa pi pl ps pt qu rm rn ro ru rw sa sc sd se sg si sk sl sm sn so sq sr ss st su sv sw ta te tg th ti tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa wo xh yi yo za zh zu".split(" ")
6
+ );
4
7
  export const DEFAULT_ISO_LOCALE = "de";
5
8
  export function countryCodes() {
6
9
  return COUNTRY_CODES;
@@ -31,7 +34,10 @@ function collator(locale) {
31
34
  function build(codes, type, locale) {
32
35
  const names = displayNames(type, locale);
33
36
  const compare = collator(locale).compare;
34
- return codes.map((code) => ({ code, label: names?.of(code) || code })).sort((a, b) => compare(a.label, b.label));
37
+ return codes.map((code) => {
38
+ const name = names?.of(code);
39
+ return { code, label: name || code, named: !!name && name.toLowerCase() !== code.toLowerCase() };
40
+ }).sort((a, b) => Number(b.named) - Number(a.named) || compare(a.label, b.label)).map(({ code, label }) => ({ code, label }));
35
41
  }
36
42
  const cache = /* @__PURE__ */ new Map();
37
43
  function cached(key, make) {
@@ -60,3 +66,50 @@ export function currencyLabel(code, locale = DEFAULT_ISO_LOCALE) {
60
66
  if (!key) return "";
61
67
  return displayNames("currency", locale)?.of(key) || key;
62
68
  }
69
+ export function languageCodes() {
70
+ return LANGUAGE_CODES;
71
+ }
72
+ export function languageOptions(locale = DEFAULT_ISO_LOCALE) {
73
+ return cached(`language:${locale}`, () => build(LANGUAGE_CODES, "language", locale));
74
+ }
75
+ export function languageLabel(code, locale = DEFAULT_ISO_LOCALE) {
76
+ const key = typeof code === "string" ? code.trim().replace("_", "-") : "";
77
+ if (!key) return "";
78
+ return displayNames("language", locale)?.of(key) || key;
79
+ }
80
+ export function currencyFlag(code) {
81
+ const key = typeof code === "string" ? code.trim().toUpperCase() : "";
82
+ if (key === "EUR") return "eu";
83
+ if (!/^[A-Z]{3}$/.test(key) || key.startsWith("X")) return "xx";
84
+ const issuer = key.slice(0, 2);
85
+ return COUNTRY_CODES.includes(issuer) ? issuer.toLowerCase() : "xx";
86
+ }
87
+ const LIKELY_COUNTRY = Object.freeze(Object.fromEntries(
88
+ "aa:ET ab:GE af:ZA ak:GH am:ET an:ES ar:EG as:IN av:RU ay:BO az:AZ ba:RU be:BY bg:BG bi:VU bm:ML bn:BD bo:CN br:FR bs:BA ca:ES ce:RU ch:GU co:FR cr:CA cs:CZ cv:RU cy:GB da:DK de:DE dv:MV dz:BT ee:GH el:GR en:GB es:ES et:EE eu:ES fa:IR ff:SN fi:FI fj:FJ fo:FO fr:FR fy:NL ga:IE gd:GB gl:ES gn:PY gu:IN gv:IM ha:NG he:IL hi:IN ho:PG hr:HR ht:HT hu:HU hy:AM hz:NA id:ID ig:NG ii:CN ik:US is:IS it:IT iu:CA ja:JP jv:ID ka:GE kg:CD ki:KE kj:NA kk:KZ kl:GL km:KH kn:IN ko:KR kr:NG ks:IN ku:TR kv:RU kw:GB ky:KG lb:LU lg:UG li:NL ln:CD lo:LA lt:LT lu:CD lv:LV mg:MG mh:MH mi:NZ mk:MK ml:IN mn:MN mr:IN ms:MY mt:MT my:MM na:NR nb:NO nd:ZW ne:NP ng:NA nl:NL nn:NO no:NO nr:ZA nv:US ny:MW oc:FR oj:CA om:ET or:IN os:GE pa:IN pl:PL ps:AF pt:PT qu:PE rm:CH rn:BI ro:RO ru:RU rw:RW sa:IN sc:IT sd:PK se:NO sg:CF si:LK sk:SK sl:SI sm:WS sn:ZW so:SO sq:AL sr:RS ss:ZA st:ZA su:ID sv:SE sw:TZ ta:IN te:IN tg:TJ th:TH ti:ET tk:TM tl:PH tn:ZA to:TO tr:TR ts:ZA tt:RU tw:GH ty:PF ug:CN uk:UA ur:PK uz:UZ ve:ZA vi:VN wa:BE wo:SN xh:ZA yo:NG za:CN zh:CN zu:ZA".split(" ").map((pair) => pair.split(":"))
89
+ ));
90
+ export function likelyCountry(language) {
91
+ const key = typeof language === "string" ? language.trim().toLowerCase() : "";
92
+ return LIKELY_COUNTRY[key] ?? null;
93
+ }
94
+ export function localeFlag(code) {
95
+ const { language, region } = splitLocale(code);
96
+ if (region) return region.toLowerCase();
97
+ return likelyCountry(language)?.toLowerCase() ?? "";
98
+ }
99
+ export function composeLocale(language, region) {
100
+ const lang = (language ?? "").trim().toLowerCase();
101
+ if (!/^[a-z]{2,3}$/.test(lang)) return null;
102
+ const reg = (region ?? "").trim().toUpperCase();
103
+ const tag = reg ? `${lang}-${reg}` : lang;
104
+ try {
105
+ return Intl.getCanonicalLocales(tag)[0] ?? null;
106
+ } catch {
107
+ return null;
108
+ }
109
+ }
110
+ export function splitLocale(code) {
111
+ const raw = typeof code === "string" ? code.trim().replace("_", "-") : "";
112
+ if (!raw) return { language: null, region: null };
113
+ const [language, region] = raw.split("-");
114
+ return { language: language?.toLowerCase() || null, region: region && /^[A-Za-z]{2}$/.test(region) ? region.toUpperCase() : null };
115
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Headline + subtitle out of one paragraph (EmptyNote, Michael 19.10.).
3
+ *
4
+ * Copy written as a single paragraph — a placeholder tab, an empty-state
5
+ * sentence — still has to read as a headline with an explanation under it.
6
+ * The first sentence heads, the rest explains. An abbreviation ("z. B.",
7
+ * "bzw.", "Nr.") does not end a sentence, so a short or dotted word before
8
+ * the period never splits.
9
+ */
10
+ export interface NoticeParts {
11
+ title: string;
12
+ description: string | null;
13
+ }
14
+ export declare function splitNotice(text: string | null | undefined): NoticeParts;
@@ -0,0 +1,19 @@
1
+ const ABBREVIATIONS = /* @__PURE__ */ new Set(["bzw", "usw", "ggf", "inkl", "zzgl", "evtl", "etc", "vgl", "ca", "nr", "max", "min", "abs", "gem", "sog", "e.g", "i.e", "vs"]);
2
+ export function splitNotice(text) {
3
+ const source = (text ?? "").trim();
4
+ if (!source) return { title: "", description: null };
5
+ const pattern = /([.!?])\s+(?=[A-ZÄÖÜ„"(])/g;
6
+ let match;
7
+ while (match = pattern.exec(source)) {
8
+ const end = match.index;
9
+ if (match[1] === ".") {
10
+ const word = /([\p{L}.]+)$/u.exec(source.slice(0, end))?.[1] ?? "";
11
+ const bare = word.replace(/\.$/, "");
12
+ if (bare.length <= 2 || ABBREVIATIONS.has(bare.toLowerCase())) continue;
13
+ }
14
+ const title = source.slice(0, end + 1).trim();
15
+ const description = source.slice(pattern.lastIndex).trim();
16
+ return { title, description: description || null };
17
+ }
18
+ return { title: source, description: null };
19
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Rows per page (PE-1052, Michael 15.10.): 50 by default, 25 / 50 / 100 / 200
3
+ * to choose from, remembered per user and table. The dummy keeps the choice in
4
+ * localStorage; the cockpit's `user_preferences` row is where it goes on
5
+ * transfer (same split as the density toggle).
6
+ */
7
+ export declare const PAGE_SIZE_OPTIONS: readonly [25, 50, 100, 200];
8
+ export declare const DEFAULT_PAGE_SIZE = 50;
9
+ /** The storage key for one table's page size. */
10
+ export declare function pageSizeStorageKey(table: string): string;
11
+ /** The remembered size for a table, if it is one of the offered sizes. */
12
+ export declare function readPageSize(table: string | null | undefined): number | null;
13
+ export declare function writePageSize(table: string | null | undefined, size: number): void;
14
+ /** The sizes the footer offers — the standard four, plus a surface's own if it set another. */
15
+ export declare function pageSizeOptions(current: number): number[];
@@ -0,0 +1,26 @@
1
+ export const PAGE_SIZE_OPTIONS = [25, 50, 100, 200];
2
+ export const DEFAULT_PAGE_SIZE = 50;
3
+ export function pageSizeStorageKey(table) {
4
+ return `cockpit.datatable.pageSize:${table}`;
5
+ }
6
+ export function readPageSize(table) {
7
+ if (!table) return null;
8
+ try {
9
+ if (typeof window === "undefined") return null;
10
+ const n = Number(window.localStorage.getItem(pageSizeStorageKey(table)));
11
+ return PAGE_SIZE_OPTIONS.includes(n) ? n : null;
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ export function writePageSize(table, size) {
17
+ if (!table) return;
18
+ try {
19
+ if (typeof window === "undefined") return;
20
+ window.localStorage.setItem(pageSizeStorageKey(table), String(size));
21
+ } catch {
22
+ }
23
+ }
24
+ export function pageSizeOptions(current) {
25
+ return [.../* @__PURE__ */ new Set([...PAGE_SIZE_OPTIONS, current])].sort((a, b) => a - b);
26
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Moving a row by dragging it, as arithmetic the table does not have to own.
3
+ *
4
+ * The DataTable only knows rows and keys. What a move MEANS — which position
5
+ * column is written, which rows have to change — is the surface's business, so
6
+ * the table answers one question and stops: "the operator put row X here; what
7
+ * is the order now?". Kept apart from the component so the edge cases are a
8
+ * test rather than something found by dragging.
9
+ */
10
+ /** Which half of the row under the pointer the dragged row is dropped on. */
11
+ export type DropEdge = 'before' | 'after';
12
+ /**
13
+ * The edge of a row a pointer is nearest to.
14
+ *
15
+ * The middle of the row, not an arithmetic row height: a row whose label wraps
16
+ * is taller than its neighbours, and an index derived from "pointer offset ÷ 40
17
+ * pixels" puts the row one slot off on every list that has a long value in it.
18
+ */
19
+ export declare function dropEdge(pointerY: number, rowTop: number, rowHeight: number): DropEdge;
20
+ /**
21
+ * Where a row dragged from `from` lands when dropped on the `edge` of the row
22
+ * at `target`, as an index into the list WITHOUT the dragged row taken out.
23
+ *
24
+ * Returns null when the drop changes nothing — onto itself, or onto the edge
25
+ * it already touches (the bottom of the row above, the top of the row below).
26
+ * A move that changes nothing must not write anything, and it is easy to send
27
+ * two position updates for a row the operator merely picked up and put back.
28
+ */
29
+ export declare function dropTargetIndex(from: number, target: number, edge: DropEdge): number | null;
30
+ /** The keys in their new order, `from` moved to `to`. */
31
+ export declare function moveKey<K>(keys: readonly K[], from: number, to: number): K[];
32
+ /**
33
+ * The keyboard half of the same move: one step up or down, or null at an end.
34
+ *
35
+ * Dragging is a pointer gesture and cannot be the only way to reorder a list —
36
+ * the handle is a button, and the arrow keys on it move the row one place.
37
+ */
38
+ export declare function stepTarget(from: number, delta: -1 | 1, length: number): number | null;
@@ -0,0 +1,20 @@
1
+ export function dropEdge(pointerY, rowTop, rowHeight) {
2
+ return pointerY < rowTop + rowHeight / 2 ? "before" : "after";
3
+ }
4
+ export function dropTargetIndex(from, target, edge) {
5
+ if (from < 0 || target < 0) return null;
6
+ const insertAt = edge === "before" ? target : target + 1;
7
+ const to = insertAt > from ? insertAt - 1 : insertAt;
8
+ return to === from ? null : to;
9
+ }
10
+ export function moveKey(keys, from, to) {
11
+ if (from < 0 || from >= keys.length || to < 0 || to >= keys.length || from === to) return [...keys];
12
+ const next = [...keys];
13
+ const [moved] = next.splice(from, 1);
14
+ next.splice(to, 0, moved);
15
+ return next;
16
+ }
17
+ export function stepTarget(from, delta, length) {
18
+ const to = from + delta;
19
+ return to < 0 || to >= length ? null : to;
20
+ }
@@ -0,0 +1,46 @@
1
+ import type { SidebarNavSection } from '../types/nav.js';
2
+ /**
3
+ * Area mode of the studio sidebar (Commerce Studio, click dummy variant C3).
4
+ *
5
+ * The section the route is in shows its rows as before. Every other section
6
+ * shrinks to a single "area" row; resting on it (or
7
+ * clicking it) lays a panel with that section's rows next to the sidebar.
8
+ * Nothing folds: which section is open follows the route, not a toggle.
9
+ */
10
+ export type SidebarAreaBlock = {
11
+ kind: 'section';
12
+ section: SidebarNavSection;
13
+ } | {
14
+ kind: 'area';
15
+ section: SidebarNavSection;
16
+ };
17
+ /** True when one of the section's rows (or their tabs) holds `path`. */
18
+ export declare function sectionHoldsActive(section: SidebarNavSection, path: string, best?: number): boolean;
19
+ /**
20
+ * A section whose one entry carries the section's own name (Konfiguration →
21
+ * Konfiguration) is that entry: a plain link row, never an area with a panel
22
+ * of one (Michael 17.10.).
23
+ */
24
+ export declare function isSelfNamed(section: SidebarNavSection): boolean;
25
+ /**
26
+ * Which sections render as rows and which as area rows. Only a section without
27
+ * a label (the pinned Dashboard row) and the route's own section show rows;
28
+ * a one-row section is an area too, so every section reads the same way
29
+ * (Michael 17.10.). With `best`, only the section of the closest match opens.
30
+ */
31
+ export declare function sidebarAreaBlocks(sections: SidebarNavSection[], path: string, best?: number): SidebarAreaBlock[];
32
+ export interface Point {
33
+ x: number;
34
+ y: number;
35
+ }
36
+ /**
37
+ * Safe triangle: is `p` inside the triangle spanned by where the pointer last
38
+ * rested on the open area row (`apex`) and the panel's near edge (`top`,
39
+ * `bottom`)? Then the pointer is on its way into the panel and crossing other
40
+ * area rows must not switch the panel (Tog's Apple menus, Amazon's menu-aim).
41
+ */
42
+ export declare function inSafeTriangle(p: Point, apex: Point, top: Point, bottom: Point): boolean;
43
+ /** Timings, in ms. Opening waits for a rest; switching an open panel does not. */
44
+ export declare const AREA_OPEN_DELAY = 150;
45
+ export declare const AREA_AIM_DELAY = 180;
46
+ export declare const AREA_CLOSE_DELAY = 300;
@@ -0,0 +1,25 @@
1
+ import { sidebarItemHoldsActive, sidebarItemMatchLength } from "./sidebarNav.js";
2
+ export function sectionHoldsActive(section, path, best) {
3
+ if (best === void 0) return section.items.some((item) => sidebarItemHoldsActive(item, path));
4
+ return best >= 0 && section.items.some((item) => sidebarItemMatchLength(item, path) === best);
5
+ }
6
+ export function isSelfNamed(section) {
7
+ return section.items.length === 1 && section.items[0].label === section.label;
8
+ }
9
+ export function sidebarAreaBlocks(sections, path, best) {
10
+ return sections.map(
11
+ (section) => !section.label || isSelfNamed(section) || sectionHoldsActive(section, path, best) ? { kind: "section", section } : { kind: "area", section }
12
+ );
13
+ }
14
+ export function inSafeTriangle(p, apex, top, bottom) {
15
+ const side = (a, b, c) => (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y);
16
+ const d1 = side(p, apex, top);
17
+ const d2 = side(p, top, bottom);
18
+ const d3 = side(p, bottom, apex);
19
+ const neg = d1 < 0 || d2 < 0 || d3 < 0;
20
+ const pos = d1 > 0 || d2 > 0 || d3 > 0;
21
+ return !(neg && pos);
22
+ }
23
+ export const AREA_OPEN_DELAY = 150;
24
+ export const AREA_AIM_DELAY = 180;
25
+ export const AREA_CLOSE_DELAY = 300;
@@ -1,3 +1,4 @@
1
+ import type { InjectionKey, Ref } from 'vue';
1
2
  import type { SidebarNavItem } from '../types/nav.js';
2
3
  /**
3
4
  * Pure helpers behind `SidebarNav` / `SidebarNavLink`. They live outside the
@@ -12,16 +13,34 @@ import type { SidebarNavItem } from '../types/nav.js';
12
13
  */
13
14
  /** Stable identity for `v-for` keys — `to` is unique where it exists. */
14
15
  export declare function sidebarItemKey(item: SidebarNavItem): string;
15
- /** True when `path` is the item's own route, or sits below it. */
16
+ /**
17
+ * True when `path` is the item's own route, or sits below it. `path` may carry
18
+ * a query: an item whose `to` names one (`/configuration?tab=markets`) is the
19
+ * page with exactly those parameters (an empty value: the parameter is
20
+ * absent); every other item ignores the query.
21
+ */
16
22
  export declare function sidebarItemIsActive(item: SidebarNavItem, path: string): boolean;
17
23
  /** True when the item, or any of its tabs, matches `path`. */
18
24
  export declare function sidebarItemHoldsActive(item: SidebarNavItem, path: string): boolean;
25
+ /**
26
+ * How closely the item (or one of its tabs) matches `path`: the length of the
27
+ * longest matching route, -1 when none does. Two rows can both hold a path —
28
+ * Konfiguration's Zahlung owns `/payments/providers`, Auftragsabwicklung's
29
+ * Zahlungen owns `/payments` — and only the closer one is where you are.
30
+ */
31
+ export declare function sidebarItemMatchLength(item: SidebarNavItem, path: string): number;
32
+ /** The closest match any row of the sidebar has for `path` (-1: none). */
33
+ export declare function sidebarBestMatch(sections: ReadonlyArray<{
34
+ items: SidebarNavItem[];
35
+ }>, path: string): number;
36
+ /** Injected by `SidebarNav`: the closest match of the whole sidebar for the route. */
37
+ export declare const SIDEBAR_BEST_MATCH: InjectionKey<Ref<number>>;
19
38
  /**
20
39
  * Which row gets the highlight. The tabs of a group are not rows of their own,
21
40
  * so the group stays lit for every one of them — an operator on *Carriers*
22
41
  * still sees where they are, which is **Shipping**.
23
42
  */
24
- export declare function sidebarItemIsCurrent(item: SidebarNavItem, path: string): boolean;
43
+ export declare function sidebarItemIsCurrent(item: SidebarNavItem, path: string, best?: number): boolean;
25
44
  /**
26
45
  * Where the row links. A group with a route of its own opens that (it is the
27
46
  * default tab); a pure container — a heading several apps contribute to, where
@@ -3,14 +3,33 @@ export function sidebarItemKey(item) {
3
3
  }
4
4
  export function sidebarItemIsActive(item, path) {
5
5
  if (!item.to) return false;
6
- if (item.exact) return path === item.to;
7
- return path === item.to || path.startsWith(`${item.to}/`);
6
+ const [bare, query = ""] = path.split("?");
7
+ const [to, wanted] = item.to.split("?");
8
+ if (wanted !== void 0) {
9
+ const have = new URLSearchParams(query);
10
+ return bare === to && [...new URLSearchParams(wanted)].every(([k, v]) => (have.get(k) ?? "") === v);
11
+ }
12
+ if (item.exact) return bare === to;
13
+ return bare === to || bare.startsWith(`${to}/`);
8
14
  }
9
15
  export function sidebarItemHoldsActive(item, path) {
10
16
  return sidebarItemIsActive(item, path) || (item.children ?? []).some((child) => sidebarItemHoldsActive(child, path));
11
17
  }
12
- export function sidebarItemIsCurrent(item, path) {
13
- return sidebarItemHoldsActive(item, path);
18
+ export function sidebarItemMatchLength(item, path) {
19
+ const own = sidebarItemIsActive(item, path) ? item.to.length + 0.5 : -1;
20
+ return Math.max(own, ...(item.children ?? []).map((child) => tabMatchLength(child, path)));
21
+ }
22
+ function tabMatchLength(item, path) {
23
+ const own = sidebarItemIsActive(item, path) ? item.to.length : -1;
24
+ return Math.max(own, ...(item.children ?? []).map((child) => tabMatchLength(child, path)));
25
+ }
26
+ export function sidebarBestMatch(sections, path) {
27
+ return Math.max(-1, ...sections.flatMap((section) => section.items.map((item) => sidebarItemMatchLength(item, path))));
28
+ }
29
+ export const SIDEBAR_BEST_MATCH = Symbol("sidebar-best-match");
30
+ export function sidebarItemIsCurrent(item, path, best) {
31
+ if (best === void 0) return sidebarItemHoldsActive(item, path);
32
+ return best >= 0 && sidebarItemMatchLength(item, path) === best;
14
33
  }
15
34
  export function sidebarItemTarget(item) {
16
35
  if (item.to) return item.to;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * GENERATED by `node scripts/icons.mjs`. Do not edit by hand.
3
+ *
4
+ * The closed set of Solar icons the cockpit resolves by name: every icon the
5
+ * app manifests, this repo's code and the curated picker set ask for. Named
6
+ * imports, so the bundle carries these 150 instead of all 1,413
7
+ * (PE-985). A name outside the set renders the fallback glyph; run
8
+ * `pnpm icons` after adding one, and `pnpm icons:check` to verify.
9
+ */
10
+ import type { Component } from 'vue';
11
+ import { Record } from '#solar-icons';
12
+ export declare const SOLAR_ICON_MAP: Readonly<Record<string, Component>>;
13
+ /** Manifest names Solar does not have → the glyph drawn for them. */
14
+ export declare const SOLAR_ICON_ALIASES: Readonly<Record<string, string>>;
15
+ /** Drawn for a name outside the map. */
16
+ export declare const SOLAR_FALLBACK_ICON: Component;