@threadlabs/looma 0.10.11 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/components/shared/editor.js +2 -26
  2. package/components/shared/icons.js +53 -0
  3. package/components/ui-avatar-group/ui-avatar-group.html +6 -6
  4. package/components/ui-avatar-group/ui-avatar-group.js +1 -1
  5. package/components/ui-breadcrumb-item/ui-breadcrumb-item.html +60 -0
  6. package/components/ui-breadcrumbs/ui-breadcrumbs.html +31 -0
  7. package/components/ui-card/ui-card.html +55 -0
  8. package/components/ui-combobox/ui-combobox.js +2 -2
  9. package/components/ui-context-menu/ui-context-menu.js +4 -4
  10. package/components/ui-cover/ui-cover.html +36 -0
  11. package/components/ui-description-item/ui-description-item.html +46 -0
  12. package/components/ui-description-list/ui-description-list.html +37 -0
  13. package/components/ui-icon/ui-icon.js +1 -1
  14. package/components/ui-list/ui-list.html +33 -0
  15. package/components/ui-list-item/ui-list-item.html +146 -0
  16. package/components/ui-menu/ui-menu.js +3 -3
  17. package/components/ui-page-header/ui-page-header.html +97 -0
  18. package/components/ui-radio/ui-radio.js +1 -1
  19. package/components/ui-radio-group/ui-radio-group.js +1 -1
  20. package/components/ui-section/ui-section.html +108 -0
  21. package/components/ui-spinner/ui-spinner.html +48 -0
  22. package/components/ui-status-message/ui-status-message.html +84 -0
  23. package/components/ui-text/ui-text.html +96 -0
  24. package/components/ui-tree/ui-tree.js +2 -2
  25. package/components/ui-tree-item/ui-tree-item.js +3 -3
  26. package/dist/index.js +1 -1
  27. package/editor/icons.d.ts +5 -0
  28. package/editor/index.js +6 -1
  29. package/package.json +1 -1
  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-list-item.css +146 -0
  38. package/styles/ui-list.css +33 -0
  39. package/styles/ui-page-header.css +89 -0
  40. package/styles/ui-section.css +94 -0
  41. package/styles/ui-spinner.css +42 -0
  42. package/styles/ui-status-message.css +72 -0
  43. package/styles/ui-text.css +85 -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/UiList.d.ts +14 -0
  57. package/vanilla/UiList.js +29 -0
  58. package/vanilla/UiListItem.d.ts +15 -0
  59. package/vanilla/UiListItem.js +77 -0
  60. package/vanilla/UiPageHeader.d.ts +14 -0
  61. package/vanilla/UiPageHeader.js +78 -0
  62. package/vanilla/UiSection.d.ts +16 -0
  63. package/vanilla/UiSection.js +64 -0
  64. package/vanilla/UiSpinner.d.ts +15 -0
  65. package/vanilla/UiSpinner.js +23 -0
  66. package/vanilla/UiStatusMessage.d.ts +16 -0
  67. package/vanilla/UiStatusMessage.js +53 -0
  68. package/vanilla/UiText.d.ts +20 -0
  69. package/vanilla/UiText.js +38 -0
  70. package/vanilla/index.js +13 -0
  71. package/vue/UiAvatarGroup.vue +6 -6
  72. package/vue/UiBreadcrumbItem.d.ts +18 -0
  73. package/vue/UiBreadcrumbItem.js +2 -0
  74. package/vue/UiBreadcrumbItem.vue +101 -0
  75. package/vue/UiBreadcrumbs.d.ts +18 -0
  76. package/vue/UiBreadcrumbs.js +2 -0
  77. package/vue/UiBreadcrumbs.vue +45 -0
  78. package/vue/UiCard.d.ts +24 -0
  79. package/vue/UiCard.js +2 -0
  80. package/vue/UiCard.vue +82 -0
  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/UiList.d.ts +18 -0
  92. package/vue/UiList.js +2 -0
  93. package/vue/UiList.vue +60 -0
  94. package/vue/UiListItem.d.ts +26 -0
  95. package/vue/UiListItem.js +2 -0
  96. package/vue/UiListItem.vue +171 -0
  97. package/vue/UiPageHeader.d.ts +26 -0
  98. package/vue/UiPageHeader.js +2 -0
  99. package/vue/UiPageHeader.vue +118 -0
  100. package/vue/UiSection.d.ts +26 -0
  101. package/vue/UiSection.js +2 -0
  102. package/vue/UiSection.vue +128 -0
  103. package/vue/UiSpinner.d.ts +10 -0
  104. package/vue/UiSpinner.js +2 -0
  105. package/vue/UiSpinner.vue +87 -0
  106. package/vue/UiStatusMessage.d.ts +24 -0
  107. package/vue/UiStatusMessage.js +2 -0
  108. package/vue/UiStatusMessage.vue +121 -0
  109. package/vue/UiText.d.ts +30 -0
  110. package/vue/UiText.js +2 -0
  111. package/vue/UiText.vue +125 -0
  112. package/vue/chunks/UiAvatarGroup.js +1 -1
  113. package/vue/chunks/UiBreadcrumbItem.js +50 -0
  114. package/vue/chunks/UiBreadcrumbs.js +19 -0
  115. package/vue/chunks/UiCard.js +31 -0
  116. package/vue/chunks/UiCover.js +21 -0
  117. package/vue/chunks/UiDescriptionItem.js +16 -0
  118. package/vue/chunks/UiDescriptionList.js +21 -0
  119. package/vue/chunks/UiList.js +24 -0
  120. package/vue/chunks/UiListItem.js +39 -0
  121. package/vue/chunks/UiPageHeader.js +35 -0
  122. package/vue/chunks/UiSection.js +34 -0
  123. package/vue/chunks/UiSpinner.js +64 -0
  124. package/vue/chunks/UiStatusMessage.js +54 -0
  125. package/vue/chunks/UiText.js +40 -0
  126. package/vue/components.css +661 -29
  127. package/vue/index.d.ts +13 -0
  128. package/vue/index.js +15 -2
package/editor/icons.d.ts CHANGED
@@ -4,16 +4,20 @@ export declare const LOOMA_ICONS: {
4
4
  'align-center': IconNode;
5
5
  'align-left': IconNode;
6
6
  'align-right': IconNode;
7
+ 'arrow-left': IconNode;
7
8
  bold: IconNode;
8
9
  braces: IconNode;
9
10
  'circle-check': IconNode;
10
11
  'circle-x': IconNode;
11
12
  'chevron-down': IconNode;
12
13
  'chevron-left': IconNode;
14
+ 'chevron-right': IconNode;
13
15
  'code-xml': IconNode;
14
16
  columns: IconNode;
15
17
  ellipsis: IconNode;
16
18
  eraser: IconNode;
19
+ 'file-text': IconNode;
20
+ folder: IconNode;
17
21
  'grip-horizontal': IconNode;
18
22
  'grip-vertical': IconNode;
19
23
  'heading-1': IconNode;
@@ -26,6 +30,7 @@ export declare const LOOMA_ICONS: {
26
30
  list: IconNode;
27
31
  'list-ordered': IconNode;
28
32
  'list-todo': IconNode;
33
+ loader: IconNode;
29
34
  merge: IconNode;
30
35
  'notebook-pen': IconNode;
31
36
  minus: IconNode;
package/editor/index.js CHANGED
@@ -1,23 +1,27 @@
1
1
  import { n as TABLE_CELL_BACKGROUND_PRESETS, t as TABLE_CELL_BACKGROUND_OPTIONS } from "./chunks/table-backgrounds.js";
2
2
  import { n as resolveTableCellAt, t as measureTableOverlayGeometry } from "./chunks/ui.js";
3
3
  import { A as LOOMA_ACTIVE_BLOCK_CLASS, C as DEFAULT_MENTION_RESULT_LIMIT, D as LOOMA_CALLOUT_TONES, E as normalizeMentionResultLimit, M as LoomaActiveBlock, N as LoomaActiveBlockPluginKey, O as LoomaCallout, S as createLoomaMentionExtension, T as filterLoomaMentionItems, _ as getActiveTableCellBackground, a as handleTableAction, b as LoomaSmartPaste, c as normalizeActiveTableColumnWidths, d as getDefaultEditorExtensions, f as getLoomaTableExtensions, g as getActiveTableCellAlignment, h as LoomaTableHeader, i as getActiveTableUiState, j as LOOMA_ACTIVE_BLOCK_TYPING_IDLE_MS, k as LOOMA_ACTIVE_BLOCK_BLUR_GRACE_MS, l as shouldShowTextFormattingToolbar, m as LoomaTableCell, n as createLoomaSlashCommandExtension, o as handleTableOverlayAction, p as LoomaTable, r as getDefaultSlashCommands, s as insertTableAtRange, t as LoomaSlashCommand, u as LoomaTableKit, v as setActiveTableCellAlignment, w as MAX_MENTION_RESULT_LIMIT, x as LoomaMentionSuggestionPluginKey, y as setActiveTableCellBackground } from "./chunks/extensions.js";
4
- import { AlignCenter, AlignLeft, AlignRight, Bold, Braces, ChevronDown, ChevronLeft, CircleCheck, CircleX, CodeXml, Columns3, Ellipsis, Eraser, GripHorizontal, GripVertical, Heading1, Heading2, Heading3, Highlighter, Image, Info, Italic, List, ListOrdered, ListTodo, Merge, Minus, NotebookPen, PaintBucket, PanelBottom, PanelLeft, PanelRight, PanelTop, Pilcrow, Plus, Quote, Redo2, Rows3, Split, Strikethrough, Table2, Trash2, TriangleAlert, Underline, Undo2 } from "lucide";
4
+ import { AlignCenter, AlignLeft, AlignRight, ArrowLeft, Bold, Braces, ChevronDown, ChevronLeft, ChevronRight, CircleCheck, CircleX, CodeXml, Columns3, Ellipsis, Eraser, FileText, Folder, GripHorizontal, GripVertical, Heading1, Heading2, Heading3, Highlighter, Image, Info, Italic, List, ListOrdered, ListTodo, LoaderCircle, Merge, Minus, NotebookPen, PaintBucket, PanelBottom, PanelLeft, PanelRight, PanelTop, Pilcrow, Plus, Quote, Redo2, Rows3, Split, Strikethrough, Table2, Trash2, TriangleAlert, Underline, Undo2 } from "lucide";
5
5
  //#region src/editor/icons.ts
6
6
  /** The opinionated Lucide set used by Looma's shipped interaction surfaces. */
7
7
  var LOOMA_ICONS = {
8
8
  "align-center": AlignCenter,
9
9
  "align-left": AlignLeft,
10
10
  "align-right": AlignRight,
11
+ "arrow-left": ArrowLeft,
11
12
  bold: Bold,
12
13
  braces: Braces,
13
14
  "circle-check": CircleCheck,
14
15
  "circle-x": CircleX,
15
16
  "chevron-down": ChevronDown,
16
17
  "chevron-left": ChevronLeft,
18
+ "chevron-right": ChevronRight,
17
19
  "code-xml": CodeXml,
18
20
  columns: Columns3,
19
21
  ellipsis: Ellipsis,
20
22
  eraser: Eraser,
23
+ "file-text": FileText,
24
+ folder: Folder,
21
25
  "grip-horizontal": GripHorizontal,
22
26
  "grip-vertical": GripVertical,
23
27
  "heading-1": Heading1,
@@ -30,6 +34,7 @@ var LOOMA_ICONS = {
30
34
  list: List,
31
35
  "list-ordered": ListOrdered,
32
36
  "list-todo": ListTodo,
37
+ loader: LoaderCircle,
33
38
  merge: Merge,
34
39
  "notebook-pen": NotebookPen,
35
40
  minus: Minus,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.10.11",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -1,10 +1,10 @@
1
1
  /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
2
  @scope ([data-component~="ui-avatar-group"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
- /* Avatars separate with a tight, crisp edge, matching Looma's 1px borders rather than the
5
- * diffuse elevation overlays use. */
6
- --_overlap-shadow: -2px 0 2px -1px rgba(0, 0, 0, 0.22);
7
- --_edge-ring: 0 0 0 1px rgba(0, 0, 0, 0.08);
4
+ /* Each avatar is ringed in the surface colour, so where one overlaps the next it reads as a
5
+ * whole circle set on top, not a shape cut into the one beneath. */
6
+ --_overlap-shadow: 0 0 0 0 transparent;
7
+ --_edge-ring: 0 0 0 2px var(--ui-surface);
8
8
 
9
9
  display: flex;
10
10
  align-items: center;
@@ -16,7 +16,7 @@
16
16
  * component roots outside this style scope. */
17
17
 
18
18
  .overflow {
19
- margin-inline-start: -0.625rem;
19
+ margin-inline-start: -0.5rem;
20
20
  display: inline-flex;
21
21
  align-items: center;
22
22
  justify-content: center;
@@ -48,7 +48,7 @@
48
48
  /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
49
49
  * component roots outside this style scope. */
50
50
  :where([data-slotted], [data-slotted] *):is(*) {
51
- margin-inline-start: -0.625rem;
51
+ margin-inline-start: -0.5rem;
52
52
  flex-shrink: 0;
53
53
  border-radius: 999px;
54
54
  }
@@ -0,0 +1,57 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-breadcrumb-item"]) to ([data-component], [data-slotted]) {
3
+ /* One step in a ui-breadcrumbs trail: a link up to that place, or the current view. A chevron leads
4
+ every step but the first. An icon slotted before the name sits with it. */
5
+ :scope {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--ui-space-2);
9
+ min-inline-size: 0;
10
+ }
11
+
12
+ .separator {
13
+ display: inline-flex;
14
+ color: var(--ui-text-muted);
15
+ font-size: var(--ui-font-size-xs);
16
+ }
17
+
18
+ :scope:first-child .separator {
19
+ display: none;
20
+ }
21
+
22
+ .content {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ gap: var(--ui-space-1);
26
+ min-inline-size: 0;
27
+ }
28
+
29
+ :scope[data-ui-breadcrumb-item-state~="current"] .content {
30
+ color: var(--ui-text-primary);
31
+ font-weight: var(--ui-font-medium);
32
+ }
33
+
34
+ /* A component that sets its display still honours the hidden attribute on its root. */
35
+ :scope[hidden] {
36
+ display: none;
37
+ }
38
+ }
39
+ @scope ([data-component~="ui-breadcrumb-item"]) to ([data-component]) {
40
+ /* One step in a ui-breadcrumbs trail: a link up to that place, or the current view. A chevron leads
41
+ every step but the first. An icon slotted before the name sits with it. */
42
+
43
+ .content > :where([data-slotted], [data-slotted] *):is(a) {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ gap: var(--ui-space-1);
47
+ color: var(--ui-text-secondary);
48
+ text-decoration: none;
49
+ }
50
+
51
+ .content > :where([data-slotted], [data-slotted] *):is(a:hover) {
52
+ color: var(--ui-text-primary);
53
+ text-decoration: underline;
54
+ }
55
+
56
+ /* A component that sets its display still honours the hidden attribute on its root. */
57
+ }
@@ -0,0 +1,32 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-breadcrumbs"]) to ([data-component], [data-slotted]) {
3
+ /* Where a view sits: a trail of ui-breadcrumb-item, from the top down to the current view. It wraps
4
+ rather than scrolls, so every step stays reachable. */
5
+ :scope {
6
+ display: block;
7
+ min-inline-size: 0;
8
+ color: var(--ui-text-muted);
9
+ font-size: var(--ui-font-size-sm);
10
+ }
11
+
12
+ ol {
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ align-items: center;
16
+ gap: var(--ui-space-1) var(--ui-space-2);
17
+ margin: 0;
18
+ padding: 0;
19
+ list-style: none;
20
+ }
21
+
22
+ /* A component that sets its display still honours the hidden attribute on its root. */
23
+ :scope[hidden] {
24
+ display: none;
25
+ }
26
+ }
27
+ @scope ([data-component~="ui-breadcrumbs"]) to ([data-component]) {
28
+ /* Where a view sits: a trail of ui-breadcrumb-item, from the top down to the current view. It wraps
29
+ rather than scrolls, so every step stays reachable. */
30
+
31
+ /* A component that sets its display still honours the hidden attribute on its root. */
32
+ }
@@ -0,0 +1,51 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-card"]) to ([data-component], [data-slotted]) {
3
+ /* A surface that groups content. Its children stack with even space between them, so a card
4
+ needs no layout of its own. */
5
+ :scope {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--ui-space-4);
9
+ box-sizing: border-box;
10
+ min-inline-size: 0;
11
+ padding: var(--ui-space-5);
12
+ border: 1px solid var(--ui-border-default);
13
+ border-radius: var(--ui-radius-lg);
14
+ background: var(--ui-surface-raised);
15
+ color: var(--ui-text-primary);
16
+ }
17
+
18
+ :scope[data-ui-card-state~="padding=sm"] {
19
+ gap: var(--ui-space-2);
20
+ padding: var(--ui-space-3);
21
+ }
22
+
23
+ :scope[data-ui-card-state~="padding=lg"] {
24
+ padding: var(--ui-space-6);
25
+ }
26
+
27
+ :scope[data-ui-card-state~="variant=subtle"] {
28
+ border-color: transparent;
29
+ background: var(--ui-surface-muted);
30
+ }
31
+
32
+ :scope[data-ui-card-state~="variant=elevated"] {
33
+ border-color: var(--ui-border-subtle);
34
+ box-shadow: var(--ui-shadow-lg);
35
+ }
36
+
37
+ :scope[data-ui-card-state~="tone=danger"] {
38
+ border-color: var(--ui-danger);
39
+ }
40
+
41
+ /* A component that sets its display still honours the hidden attribute on its root. */
42
+ :scope[hidden] {
43
+ display: none;
44
+ }
45
+ }
46
+ @scope ([data-component~="ui-card"]) to ([data-component]) {
47
+ /* A surface that groups content. Its children stack with even space between them, so a card
48
+ needs no layout of its own. */
49
+
50
+ /* A component that sets its display still honours the hidden attribute on its root. */
51
+ }
@@ -0,0 +1,35 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-cover"]) to ([data-component], [data-slotted]) {
3
+ /* A layout primitive that centres its content in the space, both ways, with room around it: the
4
+ frame for a view that is one card or one message. */
5
+ :scope {
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ gap: var(--ui-space-6);
11
+ box-sizing: border-box;
12
+ min-block-size: 100dvh;
13
+ padding: var(--ui-space-6) var(--ui-space-4);
14
+ }
15
+
16
+ :scope[data-ui-cover-state~="size=fill"] {
17
+ flex: 1;
18
+ min-block-size: 100%;
19
+ }
20
+
21
+ /* A component that sets its display still honours the hidden attribute on its root. */
22
+ :scope[hidden] {
23
+ display: none;
24
+ }
25
+ }
26
+ @scope ([data-component~="ui-cover"]) to ([data-component]) {
27
+ /* A layout primitive that centres its content in the space, both ways, with room around it: the
28
+ frame for a view that is one card or one message. */
29
+
30
+ :scope > :where([data-slotted], [data-slotted] *):is(*) {
31
+ max-inline-size: 100%;
32
+ }
33
+
34
+ /* A component that sets its display still honours the hidden attribute on its root. */
35
+ }
@@ -0,0 +1,43 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-description-item"]) to ([data-component], [data-slotted]) {
3
+ /* One term and its value in a ui-description-list, laid out by the list's layout. */
4
+ :scope {
5
+ display: var(--_ui-description-display, grid);
6
+ grid-column: var(--_ui-description-column, 1 / -1);
7
+ grid-template-columns: subgrid;
8
+ flex-direction: column;
9
+ align-items: var(--_ui-description-align, baseline);
10
+ gap: var(--ui-space-1) var(--ui-space-6);
11
+ min-inline-size: 0;
12
+ padding: var(--_ui-description-padding, 0);
13
+ border-width: var(--_ui-description-border-width, 0);
14
+ border-style: solid;
15
+ border-color: var(--ui-border-default);
16
+ border-radius: var(--ui-radius-md);
17
+ font-size: var(--ui-font-size-sm);
18
+ }
19
+
20
+ dt {
21
+ color: var(--ui-text-muted);
22
+ }
23
+
24
+ dd {
25
+ margin: 0;
26
+ min-inline-size: 0;
27
+ color: var(--ui-text-primary);
28
+ font-weight: var(--ui-font-medium);
29
+ font-size: var(--_ui-description-value-size, inherit);
30
+ text-align: start;
31
+ overflow-wrap: anywhere;
32
+ }
33
+
34
+ /* A component that sets its display still honours the hidden attribute on its root. */
35
+ :scope[hidden] {
36
+ display: none;
37
+ }
38
+ }
39
+ @scope ([data-component~="ui-description-item"]) to ([data-component]) {
40
+ /* One term and its value in a ui-description-list, laid out by the list's layout. */
41
+
42
+ /* A component that sets its display still honours the hidden attribute on its root. */
43
+ }
@@ -0,0 +1,38 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-description-list"]) to ([data-component], [data-slotted]) {
3
+ /* Named values: a term and what it is, for each item (ui-description-item). */
4
+ /* Rows line every term up in one column and every value in the next, through subgrid. */
5
+ :scope {
6
+ display: grid;
7
+ grid-template-columns: minmax(6rem, max-content) minmax(0, 1fr);
8
+ gap: var(--ui-space-2) var(--ui-space-6);
9
+ min-inline-size: 0;
10
+ margin: 0;
11
+ }
12
+
13
+ /* Tiles pass their shape to the items through private properties, which cross into each item. */
14
+ :scope[data-ui-description-list-state~="layout=tiles"] {
15
+ --_ui-description-display: flex;
16
+ --_ui-description-column: auto;
17
+ --_ui-description-align: flex-start;
18
+ --_ui-description-value-size: var(--ui-font-size-lg);
19
+ --_ui-description-padding: var(--ui-space-3);
20
+ --_ui-description-border-width: 1px;
21
+ display: grid;
22
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 10rem), 1fr));
23
+ gap: var(--ui-space-3);
24
+ }
25
+
26
+ /* A component that sets its display still honours the hidden attribute on its root. */
27
+ :scope[hidden] {
28
+ display: none;
29
+ }
30
+ }
31
+ @scope ([data-component~="ui-description-list"]) to ([data-component]) {
32
+ /* Named values: a term and what it is, for each item (ui-description-item). */
33
+ /* Rows line every term up in one column and every value in the next, through subgrid. */
34
+
35
+ /* Tiles pass their shape to the items through private properties, which cross into each item. */
36
+
37
+ /* A component that sets its display still honours the hidden attribute on its root. */
38
+ }
@@ -0,0 +1,146 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-list-item"]) to ([data-component], [data-slotted]) {
3
+ /* One entry in a list: something to recognise (leading, usually an icon), its name (the default
4
+ slot), one line about it (description), and what it offers (trailing, such as a button or a
5
+ badge). The title and description are one line each and end in an ellipsis, so every item in a
6
+ list has the same height.
7
+
8
+ A link in the title is the whole item: its hit area stretches over the item, so the icon and the
9
+ padding follow it too, and the item takes the link's focus ring. The link stays a real link, so
10
+ a router, a modified click, and "open in new tab" all work. Trailing controls sit above it and
11
+ stay their own. */
12
+ :scope {
13
+ position: relative;
14
+ box-sizing: border-box;
15
+ display: flex;
16
+ align-items: center;
17
+ gap: var(--ui-list-item-gap, var(--ui-space-3));
18
+ min-inline-size: 0;
19
+ min-block-size: var(--ui-control-size, 2.5rem);
20
+ padding-block: var(--ui-list-item-padding-block, var(--ui-space-2));
21
+ padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-3));
22
+ border-radius: var(--ui-radius-md);
23
+ color: var(--ui-text-primary);
24
+ transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), border-color var(--ui-motion-fast) var(--ui-motion-ease);
25
+ }
26
+
27
+ :scope[data-ui-list-item-state~="variant=card"] {
28
+ padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
29
+ padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
30
+ border: 1px solid var(--ui-border-default);
31
+ border-radius: var(--ui-radius-lg);
32
+ background: var(--ui-surface-raised);
33
+ }
34
+
35
+ :scope:has(.title a[href]:hover) {
36
+ background: var(--ui-surface-hover);
37
+ }
38
+
39
+ :scope[data-ui-list-item-state~="variant=card"]:has(.title a[href]:hover) {
40
+ border-color: var(--ui-border-strong);
41
+ }
42
+
43
+ :scope[data-ui-list-item-state~="current"] {
44
+ background: var(--ui-surface-hover);
45
+ }
46
+
47
+ :scope:has(.title a[href]:focus-visible) {
48
+ box-shadow: 0 0 0 2px var(--ui-focus-ring);
49
+ }
50
+
51
+ .leading,
52
+ .trailing {
53
+ display: inline-flex;
54
+ flex: none;
55
+ align-items: center;
56
+ gap: var(--ui-space-2);
57
+ }
58
+
59
+ .leading {
60
+ color: var(--ui-text-muted);
61
+ font-size: var(--ui-list-item-icon-size, var(--ui-font-size-lg));
62
+ }
63
+
64
+ /* Trailing controls take their own clicks, above the title link's stretched hit area. */
65
+ .trailing {
66
+ position: relative;
67
+ z-index: 1;
68
+ color: var(--ui-text-muted);
69
+ font-size: var(--ui-font-size-sm);
70
+ }
71
+
72
+ .content {
73
+ display: flex;
74
+ flex: 1;
75
+ flex-direction: column;
76
+ gap: var(--ui-space-0-5, 2px);
77
+ min-inline-size: 0;
78
+ }
79
+
80
+ .title,
81
+ .description {
82
+ display: block;
83
+ min-inline-size: 0;
84
+ overflow: hidden;
85
+ text-overflow: ellipsis;
86
+ white-space: nowrap;
87
+ }
88
+
89
+ .title {
90
+ font-size: var(--ui-font-size-md);
91
+ font-weight: var(--ui-font-medium);
92
+ line-height: var(--ui-line-height-tight);
93
+ }
94
+
95
+ .description {
96
+ color: var(--ui-text-muted);
97
+ font-size: var(--ui-font-size-sm);
98
+ line-height: var(--ui-line-height-tight);
99
+ }
100
+
101
+ /* An unused region takes no space. */
102
+ .leading:empty,
103
+ .description:empty,
104
+ .trailing:empty {
105
+ display: none;
106
+ }
107
+
108
+ /* A component that sets its display still honours the hidden attribute on its root. */
109
+ :scope[hidden] {
110
+ display: none;
111
+ }
112
+ }
113
+ @scope ([data-component~="ui-list-item"]) to ([data-component]) {
114
+ /* One entry in a list: something to recognise (leading, usually an icon), its name (the default
115
+ slot), one line about it (description), and what it offers (trailing, such as a button or a
116
+ badge). The title and description are one line each and end in an ellipsis, so every item in a
117
+ list has the same height.
118
+
119
+ A link in the title is the whole item: its hit area stretches over the item, so the icon and the
120
+ padding follow it too, and the item takes the link's focus ring. The link stays a real link, so
121
+ a router, a modified click, and "open in new tab" all work. Trailing controls sit above it and
122
+ stay their own. */
123
+
124
+ /* Trailing controls take their own clicks, above the title link's stretched hit area. */
125
+
126
+ .title > :where([data-slotted], [data-slotted] *):is(a) {
127
+ color: inherit;
128
+ text-decoration: none;
129
+ }
130
+
131
+ .title > :where([data-slotted], [data-slotted] *):is(a:focus-visible) {
132
+ outline: none;
133
+ box-shadow: none;
134
+ }
135
+
136
+ .title > :where([data-slotted], [data-slotted] *):is(a[href])::after {
137
+ position: absolute;
138
+ inset: 0;
139
+ border-radius: inherit;
140
+ content: "";
141
+ }
142
+
143
+ /* An unused region takes no space. */
144
+
145
+ /* A component that sets its display still honours the hidden attribute on its root. */
146
+ }
@@ -0,0 +1,33 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-list"]) to ([data-component], [data-slotted]) {
3
+ /* A list of items (ui-list-item). It owns the spacing between them, so a view never sets it. The
4
+ explicit list role keeps the list announced as one: some browsers drop it from a list with no
5
+ markers. */
6
+ :scope {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--ui-list-gap, var(--ui-space-1));
10
+ min-inline-size: 0;
11
+ margin: 0;
12
+ padding: 0;
13
+ list-style: none;
14
+ }
15
+
16
+ :scope[data-ui-list-state~="layout=grid"] {
17
+ display: grid;
18
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--ui-list-min-item-width, 14rem)), 1fr));
19
+ gap: var(--ui-list-gap, var(--ui-space-3));
20
+ }
21
+
22
+ /* A component that sets its display still honours the hidden attribute on its root. */
23
+ :scope[hidden] {
24
+ display: none;
25
+ }
26
+ }
27
+ @scope ([data-component~="ui-list"]) to ([data-component]) {
28
+ /* A list of items (ui-list-item). It owns the spacing between them, so a view never sets it. The
29
+ explicit list role keeps the list announced as one: some browsers drop it from a list with no
30
+ markers. */
31
+
32
+ /* A component that sets its display still honours the hidden attribute on its root. */
33
+ }
@@ -0,0 +1,89 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.5. Do not edit. */
2
+ @scope ([data-component~="ui-page-header"]) to ([data-component], [data-slotted]) {
3
+ /* The top of a view: its title (the page's one h1), with an optional icon or mark before it, a
4
+ short eyebrow above it, a line or two of description under it, and the view's own actions at
5
+ the end. Every view titles itself the same way, at the same size. */
6
+ :scope {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ align-items: center;
10
+ gap: var(--ui-space-3) var(--ui-space-4);
11
+ min-inline-size: 0;
12
+ }
13
+
14
+ .leading {
15
+ display: inline-flex;
16
+ flex: none;
17
+ align-self: center;
18
+ color: var(--ui-text-muted);
19
+ font-size: var(--ui-font-size-2xl);
20
+ }
21
+
22
+ .copy {
23
+ display: flex;
24
+ flex: 1 1 16rem;
25
+ flex-direction: column;
26
+ gap: var(--ui-space-1);
27
+ min-inline-size: 0;
28
+ }
29
+
30
+ .eyebrow {
31
+ color: var(--ui-text-muted);
32
+ font-size: var(--ui-font-size-xs);
33
+ font-weight: var(--ui-font-semibold);
34
+ letter-spacing: 0.06em;
35
+ text-transform: uppercase;
36
+ }
37
+
38
+ .title {
39
+ margin: 0;
40
+ color: var(--ui-text-primary);
41
+ font-size: var(--ui-font-size-2xl);
42
+ font-weight: var(--ui-font-bold, 700);
43
+ line-height: var(--ui-line-height-tight);
44
+ overflow-wrap: anywhere;
45
+ }
46
+
47
+ .description {
48
+ color: var(--ui-text-secondary);
49
+ font-size: var(--ui-font-size-md);
50
+ line-height: var(--ui-line-height);
51
+ }
52
+
53
+ .actions {
54
+ display: inline-flex;
55
+ flex: none;
56
+ flex-wrap: wrap;
57
+ align-items: center;
58
+ gap: var(--ui-space-2);
59
+ }
60
+
61
+ :scope[data-ui-page-header-state~="align=center"] {
62
+ flex-direction: column;
63
+ text-align: center;
64
+ }
65
+
66
+ :scope[data-ui-page-header-state~="align=center"] .copy {
67
+ align-items: center;
68
+ flex-basis: auto;
69
+ }
70
+
71
+ .leading:empty,
72
+ .eyebrow:empty,
73
+ .description:empty,
74
+ .actions:empty {
75
+ display: none;
76
+ }
77
+
78
+ /* A component that sets its display still honours the hidden attribute on its root. */
79
+ :scope[hidden] {
80
+ display: none;
81
+ }
82
+ }
83
+ @scope ([data-component~="ui-page-header"]) to ([data-component]) {
84
+ /* The top of a view: its title (the page's one h1), with an optional icon or mark before it, a
85
+ short eyebrow above it, a line or two of description under it, and the view's own actions at
86
+ the end. Every view titles itself the same way, at the same size. */
87
+
88
+ /* A component that sets its display still honours the hidden attribute on its root. */
89
+ }