@threadlabs/looma 0.10.12 → 0.11.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 (154) hide show
  1. package/components/shared/editor.js +2 -26
  2. package/components/shared/icons.js +53 -0
  3. package/components/ui-action-bar/ui-action-bar.html +72 -0
  4. package/components/ui-avatar-group/ui-avatar-group.html +6 -6
  5. package/components/ui-avatar-group/ui-avatar-group.js +1 -1
  6. package/components/ui-breadcrumb-item/ui-breadcrumb-item.html +60 -0
  7. package/components/ui-breadcrumbs/ui-breadcrumbs.html +31 -0
  8. package/components/ui-card/ui-card.html +55 -0
  9. package/components/ui-combobox/ui-combobox.js +2 -2
  10. package/components/ui-context-menu/ui-context-menu.js +4 -4
  11. package/components/ui-cover/ui-cover.html +36 -0
  12. package/components/ui-description-item/ui-description-item.html +46 -0
  13. package/components/ui-description-list/ui-description-list.html +37 -0
  14. package/components/ui-icon/ui-icon.js +1 -1
  15. package/components/ui-menu/ui-menu.js +3 -3
  16. package/components/ui-page-header/ui-page-header.html +97 -0
  17. package/components/ui-radio/ui-radio.js +1 -1
  18. package/components/ui-radio-group/ui-radio-group.js +1 -1
  19. package/components/ui-section/ui-section.html +108 -0
  20. package/components/ui-spinner/ui-spinner.html +48 -0
  21. package/components/ui-status-message/ui-status-message.html +84 -0
  22. package/components/ui-text/ui-text.html +96 -0
  23. package/components/ui-tree/ui-tree.js +2 -2
  24. package/components/ui-tree-item/ui-tree-item.js +3 -3
  25. package/dist/index.js +1 -1
  26. package/editor/icons.d.ts +5 -0
  27. package/editor/index.js +6 -1
  28. package/package.json +1 -1
  29. package/styles/ui-action-bar.css +77 -0
  30. package/styles/ui-avatar-group.css +6 -6
  31. package/styles/ui-breadcrumb-item.css +57 -0
  32. package/styles/ui-breadcrumbs.css +32 -0
  33. package/styles/ui-card.css +51 -0
  34. package/styles/ui-cover.css +35 -0
  35. package/styles/ui-description-item.css +43 -0
  36. package/styles/ui-description-list.css +38 -0
  37. package/styles/ui-page-header.css +89 -0
  38. package/styles/ui-section.css +94 -0
  39. package/styles/ui-spinner.css +42 -0
  40. package/styles/ui-status-message.css +72 -0
  41. package/styles/ui-text.css +85 -0
  42. package/vanilla/UiActionBar.d.ts +13 -0
  43. package/vanilla/UiActionBar.js +59 -0
  44. package/vanilla/UiBreadcrumbItem.d.ts +14 -0
  45. package/vanilla/UiBreadcrumbItem.js +38 -0
  46. package/vanilla/UiBreadcrumbs.d.ts +14 -0
  47. package/vanilla/UiBreadcrumbs.js +39 -0
  48. package/vanilla/UiCard.d.ts +17 -0
  49. package/vanilla/UiCard.js +32 -0
  50. package/vanilla/UiCover.d.ts +14 -0
  51. package/vanilla/UiCover.js +28 -0
  52. package/vanilla/UiDescriptionItem.d.ts +14 -0
  53. package/vanilla/UiDescriptionItem.js +39 -0
  54. package/vanilla/UiDescriptionList.d.ts +14 -0
  55. package/vanilla/UiDescriptionList.js +28 -0
  56. package/vanilla/UiPageHeader.d.ts +14 -0
  57. package/vanilla/UiPageHeader.js +78 -0
  58. package/vanilla/UiSection.d.ts +16 -0
  59. package/vanilla/UiSection.js +64 -0
  60. package/vanilla/UiSpinner.d.ts +15 -0
  61. package/vanilla/UiSpinner.js +23 -0
  62. package/vanilla/UiStatusMessage.d.ts +16 -0
  63. package/vanilla/UiStatusMessage.js +53 -0
  64. package/vanilla/UiText.d.ts +20 -0
  65. package/vanilla/UiText.js +38 -0
  66. package/vanilla/index.js +12 -0
  67. package/vue/UiActionBar.d.ts +19 -0
  68. package/vue/UiActionBar.js +2 -0
  69. package/vue/UiActionBar.vue +77 -0
  70. package/vue/UiAvatarGroup.vue +6 -6
  71. package/vue/UiBreadcrumbItem.d.ts +18 -0
  72. package/vue/UiBreadcrumbItem.js +2 -0
  73. package/vue/UiBreadcrumbItem.vue +101 -0
  74. package/vue/UiBreadcrumbs.d.ts +18 -0
  75. package/vue/UiBreadcrumbs.js +2 -0
  76. package/vue/UiBreadcrumbs.vue +45 -0
  77. package/vue/UiCard.d.ts +24 -0
  78. package/vue/UiCard.js +2 -0
  79. package/vue/UiCard.vue +82 -0
  80. package/vue/UiCombobox.d.ts +1 -1
  81. package/vue/UiCover.d.ts +18 -0
  82. package/vue/UiCover.js +2 -0
  83. package/vue/UiCover.vue +57 -0
  84. package/vue/UiDescriptionItem.d.ts +18 -0
  85. package/vue/UiDescriptionItem.js +2 -0
  86. package/vue/UiDescriptionItem.vue +58 -0
  87. package/vue/UiDescriptionList.d.ts +18 -0
  88. package/vue/UiDescriptionList.js +2 -0
  89. package/vue/UiDescriptionList.vue +62 -0
  90. package/vue/UiIconButton.d.ts +1 -1
  91. package/vue/UiPageHeader.d.ts +26 -0
  92. package/vue/UiPageHeader.js +2 -0
  93. package/vue/UiPageHeader.vue +118 -0
  94. package/vue/UiRadioGroup.d.ts +1 -1
  95. package/vue/UiSection.d.ts +26 -0
  96. package/vue/UiSection.js +2 -0
  97. package/vue/UiSection.vue +128 -0
  98. package/vue/UiSpinner.d.ts +10 -0
  99. package/vue/UiSpinner.js +2 -0
  100. package/vue/UiSpinner.vue +87 -0
  101. package/vue/UiStatusMessage.d.ts +24 -0
  102. package/vue/UiStatusMessage.js +2 -0
  103. package/vue/UiStatusMessage.vue +121 -0
  104. package/vue/UiText.d.ts +30 -0
  105. package/vue/UiText.js +2 -0
  106. package/vue/UiText.vue +125 -0
  107. package/vue/chunks/UiActionBar.js +24 -0
  108. package/vue/chunks/UiAffordanceScope.js +1 -1
  109. package/vue/chunks/UiAvatar.js +1 -1
  110. package/vue/chunks/UiAvatarGroup.js +2 -2
  111. package/vue/chunks/UiBreadcrumbItem.js +50 -0
  112. package/vue/chunks/UiBreadcrumbs.js +19 -0
  113. package/vue/chunks/UiCard.js +31 -0
  114. package/vue/chunks/UiCheckbox.js +1 -1
  115. package/vue/chunks/UiCombobox.js +1 -1
  116. package/vue/chunks/UiContextMenu.js +1 -1
  117. package/vue/chunks/UiCover.js +21 -0
  118. package/vue/chunks/UiDescriptionItem.js +16 -0
  119. package/vue/chunks/UiDescriptionList.js +21 -0
  120. package/vue/chunks/UiDialog.js +1 -1
  121. package/vue/chunks/UiDisclosure.js +1 -1
  122. package/vue/chunks/UiEditable.js +1 -1
  123. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  124. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  125. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  126. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  127. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  128. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  129. package/vue/chunks/UiFormField.js +1 -1
  130. package/vue/chunks/UiIcon.js +1 -1
  131. package/vue/chunks/UiIconButton.js +1 -1
  132. package/vue/chunks/UiInput.js +1 -1
  133. package/vue/chunks/UiMenu.js +1 -1
  134. package/vue/chunks/UiPageHeader.js +35 -0
  135. package/vue/chunks/UiPopover.js +1 -1
  136. package/vue/chunks/UiRadio.js +1 -1
  137. package/vue/chunks/UiRadioGroup.js +1 -1
  138. package/vue/chunks/UiSearchShell.js +1 -1
  139. package/vue/chunks/UiSection.js +34 -0
  140. package/vue/chunks/UiSelect.js +1 -1
  141. package/vue/chunks/UiSidebar.js +1 -1
  142. package/vue/chunks/UiSpinner.js +64 -0
  143. package/vue/chunks/UiStatusMessage.js +54 -0
  144. package/vue/chunks/UiSwitch.js +1 -1
  145. package/vue/chunks/UiTabs.js +1 -1
  146. package/vue/chunks/UiText.js +40 -0
  147. package/vue/chunks/UiTextarea.js +1 -1
  148. package/vue/chunks/UiToastRegion.js +1 -1
  149. package/vue/chunks/UiTooltip.js +1 -1
  150. package/vue/chunks/UiTree.js +1 -1
  151. package/vue/chunks/UiTreeItem.js +1 -1
  152. package/vue/components.css +577 -29
  153. package/vue/index.d.ts +12 -0
  154. package/vue/index.js +14 -2
@@ -1,4 +1,60 @@
1
1
 
2
+ /* The action row of a form or dialog. Tertiary actions (Back, Cancel, Discard) sit at the start
3
+ edge; secondary actions (Save as draft, Preview) sit just before the primary one, which ends the
4
+ row. The bar arranges its actions and leaves their look to them. */
5
+ [data-component~="ui-action-bar"][data-v-f4ba10f3] {
6
+ --_gap: var(--ui-space-2);
7
+ display: block;
8
+ /* A size container sizes itself from its container, never its content. */
9
+ container-type: inline-size;
10
+ inline-size: 100%;
11
+ min-inline-size: 0;
12
+ }
13
+ .bar[data-v-f4ba10f3],
14
+ .tertiary[data-v-f4ba10f3],
15
+ .secondary[data-v-f4ba10f3],
16
+ .primary[data-v-f4ba10f3] {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ align-items: center;
20
+ gap: var(--ui-action-bar-gap, var(--_gap));
21
+ }
22
+
23
+ /* The tertiary group takes the spare space, pushing the rest to the end edge; without it, the
24
+ rest still ends the row. */
25
+ .bar[data-v-f4ba10f3] {
26
+ justify-content: flex-end;
27
+ }
28
+ .tertiary[data-v-f4ba10f3] {
29
+ flex: 1 1 auto;
30
+ }
31
+ .tertiary[data-v-f4ba10f3]:empty,
32
+ .secondary[data-v-f4ba10f3]:empty,
33
+ .primary[data-v-f4ba10f3]:empty {
34
+ display: none;
35
+ }
36
+
37
+ /* A narrow container stacks the actions full width, primary on top: the row turned on its end,
38
+ read from its end edge. Container queries cannot read custom properties, so the width is fixed. */
39
+ @container (inline-size < 24rem) {
40
+ .bar[data-v-f4ba10f3],
41
+ .tertiary[data-v-f4ba10f3],
42
+ .secondary[data-v-f4ba10f3],
43
+ .primary[data-v-f4ba10f3] {
44
+ flex-direction: column-reverse;
45
+ flex-wrap: nowrap;
46
+ align-items: stretch;
47
+ }
48
+ .tertiary[data-v-f4ba10f3] {
49
+ flex: none;
50
+ }
51
+ }
52
+
53
+ /* A component that sets its display still honours the hidden attribute on its root. */
54
+ [data-component~="ui-action-bar"][hidden][data-v-f4ba10f3] {
55
+ display: none;
56
+ }
57
+
2
58
  [data-component~="ui-affordance-scope"][data-v-c9fe5e81] {
3
59
  display: contents;
4
60
  --ui-affordance-scope-engaged: 0;
@@ -63,11 +119,11 @@
63
119
  display: none;
64
120
  }
65
121
 
66
- [data-component~="ui-avatar-group"][data-v-9d727004] {
67
- /* Avatars separate with a tight, crisp edge, matching Looma's 1px borders rather than the
68
- * diffuse elevation overlays use. */
69
- --_overlap-shadow: -2px 0 2px -1px rgba(0, 0, 0, 0.22);
70
- --_edge-ring: 0 0 0 1px rgba(0, 0, 0, 0.08);
122
+ [data-component~="ui-avatar-group"][data-v-6c48e0e3] {
123
+ /* Each avatar is ringed in the surface colour, so where one overlaps the next it reads as a
124
+ * whole circle set on top, not a shape cut into the one beneath. */
125
+ --_overlap-shadow: 0 0 0 0 transparent;
126
+ --_edge-ring: 0 0 0 2px var(--ui-surface);
71
127
 
72
128
  display: flex;
73
129
  align-items: center;
@@ -77,16 +133,16 @@
77
133
 
78
134
  /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
79
135
  * component roots outside this style scope. */
80
- [data-v-9d727004-s] {
81
- margin-inline-start: -0.625rem;
136
+ [data-v-6c48e0e3-s] {
137
+ margin-inline-start: -0.5rem;
82
138
  flex-shrink: 0;
83
139
  border-radius: 999px;
84
140
  }
85
- [data-v-9d727004-s]:first-child {
141
+ [data-v-6c48e0e3-s]:first-child {
86
142
  margin-inline-start: 0;
87
143
  }
88
- .overflow[data-v-9d727004] {
89
- margin-inline-start: -0.625rem;
144
+ .overflow[data-v-6c48e0e3] {
145
+ margin-inline-start: -0.5rem;
90
146
  display: inline-flex;
91
147
  align-items: center;
92
148
  justify-content: center;
@@ -104,12 +160,12 @@
104
160
  font-weight: 600;
105
161
  flex-shrink: 0;
106
162
  }
107
- .overflow[hidden][data-v-9d727004] {
163
+ .overflow[hidden][data-v-6c48e0e3] {
108
164
  display: none;
109
165
  }
110
166
 
111
167
  /* A component that sets its display still honours the hidden attribute on its root. */
112
- [data-component~="ui-avatar-group"][hidden][data-v-9d727004] {
168
+ [data-component~="ui-avatar-group"][hidden][data-v-6c48e0e3] {
113
169
  display: none;
114
170
  }
115
171
 
@@ -229,6 +285,89 @@
229
285
  display: none;
230
286
  }
231
287
 
288
+ [data-component~="ui-icon"][data-v-3d48bd86] {
289
+ display: inline-flex;
290
+ flex: none;
291
+ inline-size: var(--ui-icon-size, 1em);
292
+ block-size: var(--ui-icon-size, 1em);
293
+ }
294
+ svg[data-v-3d48bd86] {
295
+ inline-size: 100%;
296
+ block-size: 100%;
297
+ stroke-width: var(--ui-icon-stroke-width, 2);
298
+ }
299
+
300
+ /* A component that sets its display still honours the hidden attribute on its root. */
301
+ [data-component~="ui-icon"][hidden][data-v-3d48bd86] {
302
+ display: none;
303
+ }
304
+
305
+ /* One step in a ui-breadcrumbs trail: a link up to that place, or the current view. A chevron leads
306
+ every step but the first. An icon slotted before the name sits with it. */
307
+ [data-component~="ui-breadcrumb-item"][data-v-9de59def] {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ gap: var(--ui-space-2);
311
+ min-inline-size: 0;
312
+ }
313
+ .separator[data-v-9de59def] {
314
+ display: inline-flex;
315
+ color: var(--ui-text-muted);
316
+ font-size: var(--ui-font-size-xs);
317
+ }
318
+ [data-component~="ui-breadcrumb-item"]:first-child .separator[data-v-9de59def] {
319
+ display: none;
320
+ }
321
+ .content[data-v-9de59def] {
322
+ display: inline-flex;
323
+ align-items: center;
324
+ gap: var(--ui-space-1);
325
+ min-inline-size: 0;
326
+ }
327
+ .content > a[data-v-9de59def-s] {
328
+ display: inline-flex;
329
+ align-items: center;
330
+ gap: var(--ui-space-1);
331
+ color: var(--ui-text-secondary);
332
+ text-decoration: none;
333
+ }
334
+ .content > a[data-v-9de59def-s]:hover {
335
+ color: var(--ui-text-primary);
336
+ text-decoration: underline;
337
+ }
338
+ [data-component~="ui-breadcrumb-item"][data-ui-breadcrumb-item-state~="current"] .content[data-v-9de59def] {
339
+ color: var(--ui-text-primary);
340
+ font-weight: var(--ui-font-medium);
341
+ }
342
+
343
+ /* A component that sets its display still honours the hidden attribute on its root. */
344
+ [data-component~="ui-breadcrumb-item"][hidden][data-v-9de59def] {
345
+ display: none;
346
+ }
347
+
348
+ /* Where a view sits: a trail of ui-breadcrumb-item, from the top down to the current view. It wraps
349
+ rather than scrolls, so every step stays reachable. */
350
+ [data-component~="ui-breadcrumbs"][data-v-0d86d58e] {
351
+ display: block;
352
+ min-inline-size: 0;
353
+ color: var(--ui-text-muted);
354
+ font-size: var(--ui-font-size-sm);
355
+ }
356
+ ol[data-v-0d86d58e] {
357
+ display: flex;
358
+ flex-wrap: wrap;
359
+ align-items: center;
360
+ gap: var(--ui-space-1) var(--ui-space-2);
361
+ margin: 0;
362
+ padding: 0;
363
+ list-style: none;
364
+ }
365
+
366
+ /* A component that sets its display still honours the hidden attribute on its root. */
367
+ [data-component~="ui-breadcrumbs"][hidden][data-v-0d86d58e] {
368
+ display: none;
369
+ }
370
+
232
371
  [data-component~="ui-button"][data-v-0c121308] {
233
372
  --_hue: var(--ui-accent);
234
373
  --_hue-hover: var(--ui-accent-hover);
@@ -549,6 +688,44 @@
549
688
  display: none;
550
689
  }
551
690
 
691
+ /* A surface that groups content. Its children stack with even space between them, so a card
692
+ needs no layout of its own. */
693
+ [data-component~="ui-card"][data-v-d00c53f0] {
694
+ display: flex;
695
+ flex-direction: column;
696
+ gap: var(--ui-space-4);
697
+ box-sizing: border-box;
698
+ min-inline-size: 0;
699
+ padding: var(--ui-space-5);
700
+ border: 1px solid var(--ui-border-default);
701
+ border-radius: var(--ui-radius-lg);
702
+ background: var(--ui-surface-raised);
703
+ color: var(--ui-text-primary);
704
+ }
705
+ [data-component~="ui-card"][data-ui-card-state~="padding=sm"][data-v-d00c53f0] {
706
+ gap: var(--ui-space-2);
707
+ padding: var(--ui-space-3);
708
+ }
709
+ [data-component~="ui-card"][data-ui-card-state~="padding=lg"][data-v-d00c53f0] {
710
+ padding: var(--ui-space-6);
711
+ }
712
+ [data-component~="ui-card"][data-ui-card-state~="variant=subtle"][data-v-d00c53f0] {
713
+ border-color: transparent;
714
+ background: var(--ui-surface-muted);
715
+ }
716
+ [data-component~="ui-card"][data-ui-card-state~="variant=elevated"][data-v-d00c53f0] {
717
+ border-color: var(--ui-border-subtle);
718
+ box-shadow: var(--ui-shadow-lg);
719
+ }
720
+ [data-component~="ui-card"][data-ui-card-state~="tone=danger"][data-v-d00c53f0] {
721
+ border-color: var(--ui-danger);
722
+ }
723
+
724
+ /* A component that sets its display still honours the hidden attribute on its root. */
725
+ [data-component~="ui-card"][hidden][data-v-d00c53f0] {
726
+ display: none;
727
+ }
728
+
552
729
  [data-component~="ui-checkbox"][data-v-9c9d1eaa] {
553
730
  display: inline-flex;
554
731
  align-items: flex-start;
@@ -1131,6 +1308,93 @@ button[data-v-0bd7ecc4] {
1131
1308
  display: none;
1132
1309
  }
1133
1310
 
1311
+ /* A layout primitive that centres its content in the space, both ways, with room around it: the
1312
+ frame for a view that is one card or one message. */
1313
+ [data-component~="ui-cover"][data-v-f341d85e] {
1314
+ display: flex;
1315
+ flex-direction: column;
1316
+ align-items: center;
1317
+ justify-content: center;
1318
+ gap: var(--ui-space-6);
1319
+ box-sizing: border-box;
1320
+ min-block-size: 100dvh;
1321
+ padding: var(--ui-space-6) var(--ui-space-4);
1322
+ }
1323
+ [data-component~="ui-cover"][data-ui-cover-state~="size=fill"][data-v-f341d85e] {
1324
+ flex: 1;
1325
+ min-block-size: 100%;
1326
+ }
1327
+ [data-component~="ui-cover"] > [data-v-f341d85e-s] {
1328
+ max-inline-size: 100%;
1329
+ }
1330
+
1331
+ /* A component that sets its display still honours the hidden attribute on its root. */
1332
+ [data-component~="ui-cover"][hidden][data-v-f341d85e] {
1333
+ display: none;
1334
+ }
1335
+
1336
+ /* One term and its value in a ui-description-list, laid out by the list's layout. */
1337
+ [data-component~="ui-description-item"][data-v-2d94bc9f] {
1338
+ display: var(--_ui-description-display, grid);
1339
+ grid-column: var(--_ui-description-column, 1 / -1);
1340
+ grid-template-columns: subgrid;
1341
+ flex-direction: column;
1342
+ align-items: var(--_ui-description-align, baseline);
1343
+ gap: var(--ui-space-1) var(--ui-space-6);
1344
+ min-inline-size: 0;
1345
+ padding: var(--_ui-description-padding, 0);
1346
+ border-width: var(--_ui-description-border-width, 0);
1347
+ border-style: solid;
1348
+ border-color: var(--ui-border-default);
1349
+ border-radius: var(--ui-radius-md);
1350
+ font-size: var(--ui-font-size-sm);
1351
+ }
1352
+ dt[data-v-2d94bc9f] {
1353
+ color: var(--ui-text-muted);
1354
+ }
1355
+ dd[data-v-2d94bc9f] {
1356
+ margin: 0;
1357
+ min-inline-size: 0;
1358
+ color: var(--ui-text-primary);
1359
+ font-weight: var(--ui-font-medium);
1360
+ font-size: var(--_ui-description-value-size, inherit);
1361
+ text-align: start;
1362
+ overflow-wrap: anywhere;
1363
+ }
1364
+
1365
+ /* A component that sets its display still honours the hidden attribute on its root. */
1366
+ [data-component~="ui-description-item"][hidden][data-v-2d94bc9f] {
1367
+ display: none;
1368
+ }
1369
+
1370
+ /* Named values: a term and what it is, for each item (ui-description-item). */
1371
+ /* Rows line every term up in one column and every value in the next, through subgrid. */
1372
+ [data-component~="ui-description-list"][data-v-0519dd0f] {
1373
+ display: grid;
1374
+ grid-template-columns: minmax(6rem, max-content) minmax(0, 1fr);
1375
+ gap: var(--ui-space-2) var(--ui-space-6);
1376
+ min-inline-size: 0;
1377
+ margin: 0;
1378
+ }
1379
+
1380
+ /* Tiles pass their shape to the items through private properties, which cross into each item. */
1381
+ [data-component~="ui-description-list"][data-ui-description-list-state~="layout=tiles"][data-v-0519dd0f] {
1382
+ --_ui-description-display: flex;
1383
+ --_ui-description-column: auto;
1384
+ --_ui-description-align: flex-start;
1385
+ --_ui-description-value-size: var(--ui-font-size-lg);
1386
+ --_ui-description-padding: var(--ui-space-3);
1387
+ --_ui-description-border-width: 1px;
1388
+ display: grid;
1389
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 10rem), 1fr));
1390
+ gap: var(--ui-space-3);
1391
+ }
1392
+
1393
+ /* A component that sets its display still honours the hidden attribute on its root. */
1394
+ [data-component~="ui-description-list"][hidden][data-v-0519dd0f] {
1395
+ display: none;
1396
+ }
1397
+
1134
1398
  [data-component~="ui-dialog"][data-v-0fd6654c] {
1135
1399
  position: fixed;
1136
1400
  inset: 0;
@@ -1691,23 +1955,6 @@ from {
1691
1955
  display: none;
1692
1956
  }
1693
1957
 
1694
- [data-component~="ui-icon"][data-v-3d48bd86] {
1695
- display: inline-flex;
1696
- flex: none;
1697
- inline-size: var(--ui-icon-size, 1em);
1698
- block-size: var(--ui-icon-size, 1em);
1699
- }
1700
- svg[data-v-3d48bd86] {
1701
- inline-size: 100%;
1702
- block-size: 100%;
1703
- stroke-width: var(--ui-icon-stroke-width, 2);
1704
- }
1705
-
1706
- /* A component that sets its display still honours the hidden attribute on its root. */
1707
- [data-component~="ui-icon"][hidden][data-v-3d48bd86] {
1708
- display: none;
1709
- }
1710
-
1711
1958
  [data-component~="ui-editor-slash-menu"][data-v-dcc1f07d] {
1712
1959
  user-select: none;
1713
1960
  }
@@ -3201,6 +3448,77 @@ svg[data-v-bcedd63e-s] {
3201
3448
  display: none;
3202
3449
  }
3203
3450
 
3451
+ /* The top of a view: its title (the page's one h1), with an optional icon or mark before it, a
3452
+ short eyebrow above it, a line or two of description under it, and the view's own actions at
3453
+ the end. Every view titles itself the same way, at the same size. */
3454
+ [data-component~="ui-page-header"][data-v-8dcefe30] {
3455
+ display: flex;
3456
+ flex-wrap: wrap;
3457
+ align-items: center;
3458
+ gap: var(--ui-space-3) var(--ui-space-4);
3459
+ min-inline-size: 0;
3460
+ }
3461
+ .leading[data-v-8dcefe30] {
3462
+ display: inline-flex;
3463
+ flex: none;
3464
+ align-self: center;
3465
+ color: var(--ui-text-muted);
3466
+ font-size: var(--ui-font-size-2xl);
3467
+ }
3468
+ .copy[data-v-8dcefe30] {
3469
+ display: flex;
3470
+ flex: 1 1 16rem;
3471
+ flex-direction: column;
3472
+ gap: var(--ui-space-1);
3473
+ min-inline-size: 0;
3474
+ }
3475
+ .eyebrow[data-v-8dcefe30] {
3476
+ color: var(--ui-text-muted);
3477
+ font-size: var(--ui-font-size-xs);
3478
+ font-weight: var(--ui-font-semibold);
3479
+ letter-spacing: 0.06em;
3480
+ text-transform: uppercase;
3481
+ }
3482
+ .title[data-v-8dcefe30] {
3483
+ margin: 0;
3484
+ color: var(--ui-text-primary);
3485
+ font-size: var(--ui-font-size-2xl);
3486
+ font-weight: var(--ui-font-bold, 700);
3487
+ line-height: var(--ui-line-height-tight);
3488
+ overflow-wrap: anywhere;
3489
+ }
3490
+ .description[data-v-8dcefe30] {
3491
+ color: var(--ui-text-secondary);
3492
+ font-size: var(--ui-font-size-md);
3493
+ line-height: var(--ui-line-height);
3494
+ }
3495
+ .actions[data-v-8dcefe30] {
3496
+ display: inline-flex;
3497
+ flex: none;
3498
+ flex-wrap: wrap;
3499
+ align-items: center;
3500
+ gap: var(--ui-space-2);
3501
+ }
3502
+ [data-component~="ui-page-header"][data-ui-page-header-state~="align=center"][data-v-8dcefe30] {
3503
+ flex-direction: column;
3504
+ text-align: center;
3505
+ }
3506
+ [data-component~="ui-page-header"][data-ui-page-header-state~="align=center"] .copy[data-v-8dcefe30] {
3507
+ align-items: center;
3508
+ flex-basis: auto;
3509
+ }
3510
+ .leading[data-v-8dcefe30]:empty,
3511
+ .eyebrow[data-v-8dcefe30]:empty,
3512
+ .description[data-v-8dcefe30]:empty,
3513
+ .actions[data-v-8dcefe30]:empty {
3514
+ display: none;
3515
+ }
3516
+
3517
+ /* A component that sets its display still honours the hidden attribute on its root. */
3518
+ [data-component~="ui-page-header"][hidden][data-v-8dcefe30] {
3519
+ display: none;
3520
+ }
3521
+
3204
3522
  [data-component~="ui-popover"][data-v-00194c85] {
3205
3523
  box-sizing: border-box;
3206
3524
  max-inline-size: min(
@@ -3674,6 +3992,80 @@ dialog[data-v-2ba71171] {
3674
3992
  display: none;
3675
3993
  }
3676
3994
 
3995
+ /* A part of a view: a heading, an optional line under it, actions for the whole section at its
3996
+ end, and the content. Sections space themselves out through the Stack around them. */
3997
+ [data-component~="ui-section"][data-v-4d1e5a3a] {
3998
+ display: flex;
3999
+ flex-direction: column;
4000
+ gap: var(--ui-space-4);
4001
+ min-inline-size: 0;
4002
+ }
4003
+ [data-component~="ui-section"][data-ui-section-state~="variant=card"][data-v-4d1e5a3a] {
4004
+ padding: var(--ui-space-5);
4005
+ border: 1px solid var(--ui-border-default);
4006
+ border-radius: var(--ui-radius-lg);
4007
+ background: var(--ui-surface-raised);
4008
+ }
4009
+ [data-component~="ui-section"][data-ui-section-state~="variant=divided"][data-v-4d1e5a3a] {
4010
+ padding-block-start: var(--ui-space-6);
4011
+ border-block-start: 1px solid var(--ui-border-default);
4012
+ }
4013
+ [data-component~="ui-section"][data-ui-section-state~="variant=card"][data-ui-section-state~="tone=danger"][data-v-4d1e5a3a] {
4014
+ border-color: var(--ui-danger);
4015
+ }
4016
+ .head[data-v-4d1e5a3a] {
4017
+ display: flex;
4018
+ flex-wrap: wrap;
4019
+ align-items: flex-start;
4020
+ justify-content: space-between;
4021
+ gap: var(--ui-space-2) var(--ui-space-4);
4022
+ }
4023
+ .copy[data-v-4d1e5a3a] {
4024
+ display: flex;
4025
+ flex: 1 1 16rem;
4026
+ flex-direction: column;
4027
+ gap: var(--ui-space-1);
4028
+ min-inline-size: 0;
4029
+ }
4030
+ .heading[data-v-4d1e5a3a] {
4031
+ margin: 0;
4032
+ color: var(--ui-text-primary);
4033
+ font-size: var(--ui-font-size-lg);
4034
+ font-weight: var(--ui-font-semibold);
4035
+ line-height: var(--ui-line-height-tight);
4036
+ }
4037
+ [data-component~="ui-section"][data-ui-section-state~="tone=danger"] .heading[data-v-4d1e5a3a] {
4038
+ color: var(--ui-danger);
4039
+ }
4040
+ .description[data-v-4d1e5a3a] {
4041
+ color: var(--ui-text-secondary);
4042
+ font-size: var(--ui-font-size-sm);
4043
+ line-height: var(--ui-line-height);
4044
+ }
4045
+ .actions[data-v-4d1e5a3a] {
4046
+ display: inline-flex;
4047
+ flex-wrap: wrap;
4048
+ gap: var(--ui-space-2);
4049
+ }
4050
+ .body[data-v-4d1e5a3a] {
4051
+ display: flex;
4052
+ flex-direction: column;
4053
+ gap: var(--ui-space-4);
4054
+ min-inline-size: 0;
4055
+ }
4056
+ .description[data-v-4d1e5a3a]:empty,
4057
+ .actions[data-v-4d1e5a3a]:empty {
4058
+ display: none;
4059
+ }
4060
+ .head[data-v-4d1e5a3a]:has(.heading[hidden]):has(.description:empty):has(.actions:empty) {
4061
+ display: none;
4062
+ }
4063
+
4064
+ /* A component that sets its display still honours the hidden attribute on its root. */
4065
+ [data-component~="ui-section"][hidden][data-v-4d1e5a3a] {
4066
+ display: none;
4067
+ }
4068
+
3677
4069
  [data-component~="ui-select"][data-v-f9be4ab9] {
3678
4070
  box-sizing: border-box;
3679
4071
  display: inline-block;
@@ -3923,6 +4315,35 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3923
4315
  display: none;
3924
4316
  }
3925
4317
 
4318
+ /* Something is on its way. It turns in the current text colour; with reduced motion it holds still,
4319
+ and the label (or the text beside it) still says what is happening. */
4320
+ [data-component~="ui-spinner"][data-v-3472d01c] {
4321
+ display: inline-flex;
4322
+ flex: none;
4323
+ color: currentColor;
4324
+ font-size: var(--ui-font-size-lg);
4325
+ line-height: 1;
4326
+ animation: ui-spinner-turn-3472d01c 0.8s linear infinite;
4327
+ }
4328
+ [data-component~="ui-spinner"][data-ui-spinner-state~="size=sm"][data-v-3472d01c] {
4329
+ font-size: var(--ui-font-size-md);
4330
+ }
4331
+ @keyframes ui-spinner-turn-3472d01c {
4332
+ to {
4333
+ transform: rotate(1turn);
4334
+ }
4335
+ }
4336
+ @media (prefers-reduced-motion: reduce) {
4337
+ [data-component~="ui-spinner"][data-v-3472d01c] {
4338
+ animation: none;
4339
+ }
4340
+ }
4341
+
4342
+ /* A component that sets its display still honours the hidden attribute on its root. */
4343
+ [data-component~="ui-spinner"][hidden][data-v-3472d01c] {
4344
+ display: none;
4345
+ }
4346
+
3926
4347
  [data-component~="ui-stack"][data-v-e8d52a11] {
3927
4348
  --_layout-gap: var(--ui-space-4);
3928
4349
  display: flex;
@@ -3972,6 +4393,62 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3972
4393
  display: none;
3973
4394
  }
3974
4395
 
4396
+ /* The one way a view says it is loading, has nothing yet, or failed, with an optional next step.
4397
+ Every view says it the same way, in the same place, at the same size. */
4398
+ [data-component~="ui-status-message"][data-v-a56387a4] {
4399
+ display: flex;
4400
+ flex-wrap: wrap;
4401
+ align-items: center;
4402
+ gap: var(--ui-space-2) var(--ui-space-4);
4403
+ padding-block: var(--ui-space-4);
4404
+ color: var(--ui-text-muted);
4405
+ font-size: var(--ui-font-size-md);
4406
+ line-height: var(--ui-line-height);
4407
+ }
4408
+ [data-component~="ui-status-message"][data-ui-status-message-state~="kind=error"][data-v-a56387a4] {
4409
+ color: var(--ui-danger);
4410
+ }
4411
+ [data-component~="ui-status-message"][data-ui-status-message-state~="layout=panel"][data-v-a56387a4] {
4412
+ padding: var(--ui-space-6);
4413
+ border: 1px dashed var(--ui-border-default);
4414
+ border-radius: var(--ui-radius-lg);
4415
+ }
4416
+ [data-component~="ui-status-message"][data-ui-status-message-state~="layout=fill"][data-v-a56387a4] {
4417
+ flex: 1;
4418
+ flex-direction: column;
4419
+ justify-content: center;
4420
+ min-block-size: 50vh;
4421
+ text-align: center;
4422
+ }
4423
+ .copy[data-v-a56387a4] {
4424
+ display: flex;
4425
+ flex: 1 1 12rem;
4426
+ flex-direction: column;
4427
+ gap: var(--ui-space-1);
4428
+ min-inline-size: 0;
4429
+ }
4430
+ [data-component~="ui-status-message"][data-ui-status-message-state~="layout=fill"] .copy[data-v-a56387a4] {
4431
+ flex: none;
4432
+ align-items: center;
4433
+ }
4434
+ .heading[data-v-a56387a4] {
4435
+ color: var(--ui-text-primary);
4436
+ font-weight: var(--ui-font-semibold);
4437
+ }
4438
+ .action[data-v-a56387a4] {
4439
+ display: inline-flex;
4440
+ flex-wrap: wrap;
4441
+ gap: var(--ui-space-2);
4442
+ }
4443
+ .action[data-v-a56387a4]:empty {
4444
+ display: none;
4445
+ }
4446
+
4447
+ /* A component that sets its display still honours the hidden attribute on its root. */
4448
+ [data-component~="ui-status-message"][hidden][data-v-a56387a4] {
4449
+ display: none;
4450
+ }
4451
+
3975
4452
  [data-component~="ui-switch"][data-v-26ab3add] {
3976
4453
  display: inline-flex;
3977
4454
  align-items: flex-start;
@@ -4221,6 +4698,77 @@ input[data-v-26ab3add], input[data-v-26ab3add]::after {
4221
4698
  display: none;
4222
4699
  }
4223
4700
 
4701
+ /* Running text, set on the type scale and in a tone that says what it is, so a view never styles
4702
+ text of its own. The root is a paragraph unless as= names a span, div, small, strong, or label. */
4703
+ [data-component~="ui-text"][data-v-70a75450] {
4704
+ margin: 0;
4705
+ min-inline-size: 0;
4706
+ color: var(--ui-text-primary);
4707
+ text-align: start;
4708
+ }
4709
+ [data-component~="ui-text"][data-ui-text-state~="size=xs"][data-v-70a75450] {
4710
+ font-size: var(--ui-font-size-xs);
4711
+ line-height: var(--ui-line-height);
4712
+ }
4713
+ [data-component~="ui-text"][data-ui-text-state~="size=sm"][data-v-70a75450] {
4714
+ font-size: var(--ui-font-size-sm);
4715
+ line-height: var(--ui-line-height);
4716
+ }
4717
+ [data-component~="ui-text"][data-ui-text-state~="size=md"][data-v-70a75450] {
4718
+ font-size: var(--ui-font-size-md);
4719
+ line-height: var(--ui-line-height);
4720
+ }
4721
+ [data-component~="ui-text"][data-ui-text-state~="size=lg"][data-v-70a75450] {
4722
+ font-size: var(--ui-font-size-lg);
4723
+ line-height: var(--ui-line-height-relaxed);
4724
+ }
4725
+ [data-component~="ui-text"][data-ui-text-state~="tone=secondary"][data-v-70a75450] {
4726
+ color: var(--ui-text-secondary);
4727
+ }
4728
+ [data-component~="ui-text"][data-ui-text-state~="tone=muted"][data-v-70a75450] {
4729
+ color: var(--ui-text-muted);
4730
+ }
4731
+ [data-component~="ui-text"][data-ui-text-state~="tone=accent"][data-v-70a75450] {
4732
+ color: var(--ui-accent-active);
4733
+ }
4734
+ [data-component~="ui-text"][data-ui-text-state~="tone=danger"][data-v-70a75450] {
4735
+ color: var(--ui-danger);
4736
+ }
4737
+ [data-component~="ui-text"][data-ui-text-state~="tone=success"][data-v-70a75450] {
4738
+ color: var(--ui-success);
4739
+ }
4740
+ [data-component~="ui-text"][data-ui-text-state~="weight=normal"][data-v-70a75450] {
4741
+ font-weight: var(--ui-font-normal);
4742
+ }
4743
+ [data-component~="ui-text"][data-ui-text-state~="weight=medium"][data-v-70a75450] {
4744
+ font-weight: var(--ui-font-medium);
4745
+ }
4746
+ [data-component~="ui-text"][data-ui-text-state~="weight=semibold"][data-v-70a75450] {
4747
+ font-weight: var(--ui-font-semibold);
4748
+ }
4749
+ [data-component~="ui-text"][data-ui-text-state~="variant=eyebrow"][data-v-70a75450] {
4750
+ font-size: var(--ui-font-size-xs);
4751
+ font-weight: var(--ui-font-semibold);
4752
+ letter-spacing: 0.06em;
4753
+ text-transform: uppercase;
4754
+ }
4755
+ [data-component~="ui-text"][data-ui-text-state~="variant=code"][data-v-70a75450] {
4756
+ font-family: var(--ui-font-family-mono);
4757
+ }
4758
+ [data-component~="ui-text"][data-ui-text-state~="truncate"][data-v-70a75450] {
4759
+ overflow: hidden;
4760
+ text-overflow: ellipsis;
4761
+ white-space: nowrap;
4762
+ }
4763
+ [data-component~="ui-text"][data-ui-text-state~="align=center"][data-v-70a75450] {
4764
+ text-align: center;
4765
+ }
4766
+
4767
+ /* A component that sets its display still honours the hidden attribute on its root. */
4768
+ [data-component~="ui-text"][hidden][data-v-70a75450] {
4769
+ display: none;
4770
+ }
4771
+
4224
4772
  [data-component~="ui-textarea"][data-v-0352d397] {
4225
4773
  box-sizing: border-box;
4226
4774
  display: inline-block;