@threadlabs/looma 0.5.1 → 0.5.2
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.
- package/README.md +1 -1
- package/components/ui-button/ui-button.html +13 -0
- package/components/ui-combobox/ui-combobox.html +12 -4
- package/components/ui-dialog/ui-dialog.html +13 -0
- package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
- package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
- package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
- package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
- package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
- package/components/ui-form-field/ui-form-field.html +18 -7
- package/components/ui-icon/ui-icon.html +5 -1
- package/components/ui-icon-button/ui-icon-button.html +30 -0
- package/components/ui-popover/ui-popover.js +10 -2
- package/components/ui-search-shell/ui-search-shell.html +7 -0
- package/components/ui-search-shell/ui-search-shell.js +9 -0
- package/components/ui-tabs/ui-tabs.html +1 -1
- package/components/ui-toast-region/ui-toast-region.html +1 -1
- package/components/ui-tree-item/ui-tree-item.html +6 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/package.json +2 -2
- package/styles/ui-affordance-scope.css +1 -1
- package/styles/ui-avatar-group.css +1 -1
- package/styles/ui-avatar.css +1 -1
- package/styles/ui-badge.css +1 -1
- package/styles/ui-button.css +11 -1
- package/styles/ui-callout.css +1 -1
- package/styles/ui-checkbox.css +1 -1
- package/styles/ui-cluster.css +1 -1
- package/styles/ui-combobox.css +1 -1
- package/styles/ui-container.css +1 -1
- package/styles/ui-context-menu.css +1 -1
- package/styles/ui-dialog.css +18 -1
- package/styles/ui-disclosure.css +1 -1
- package/styles/ui-editable.css +1 -1
- package/styles/ui-editor-insert-table-grid.css +1 -1
- package/styles/ui-editor-mention-menu.css +1 -1
- package/styles/ui-editor-slash-menu.css +1 -1
- package/styles/ui-editor-table-context-menu.css +1 -1
- package/styles/ui-editor-table-overlay.css +1 -1
- package/styles/ui-editor-table-toolbar.css +1 -1
- package/styles/ui-editor-toolbar.css +1 -1
- package/styles/ui-floating-action-button.css +1 -1
- package/styles/ui-form-field.css +24 -10
- package/styles/ui-grid.css +1 -1
- package/styles/ui-icon-button.css +36 -1
- package/styles/ui-icon.css +1 -1
- package/styles/ui-input.css +1 -1
- package/styles/ui-menu-item.css +1 -1
- package/styles/ui-menu.css +1 -1
- package/styles/ui-popover.css +1 -1
- package/styles/ui-radio-group.css +1 -1
- package/styles/ui-radio.css +1 -1
- package/styles/ui-reel.css +1 -1
- package/styles/ui-search-result-row.css +1 -1
- package/styles/ui-search-shell.css +11 -2
- package/styles/ui-select.css +1 -1
- package/styles/ui-separator.css +1 -1
- package/styles/ui-sidebar.css +1 -1
- package/styles/ui-stack.css +1 -1
- package/styles/ui-switch.css +1 -1
- package/styles/ui-switcher.css +1 -1
- package/styles/ui-tabs.css +1 -1
- package/styles/ui-textarea.css +1 -1
- package/styles/ui-toast-region.css +1 -1
- package/styles/ui-tooltip.css +1 -1
- package/styles/ui-top-bar.css +1 -1
- package/styles/ui-tree-item.css +10 -2
- package/styles/ui-tree.css +1 -1
- package/vanilla/UiAffordanceScope.d.ts +1 -1
- package/vanilla/UiAffordanceScope.js +2 -2
- package/vanilla/UiAvatar.d.ts +1 -1
- package/vanilla/UiAvatar.js +2 -2
- package/vanilla/UiAvatarGroup.d.ts +1 -1
- package/vanilla/UiAvatarGroup.js +2 -2
- package/vanilla/UiBadge.d.ts +1 -1
- package/vanilla/UiBadge.js +2 -2
- package/vanilla/UiButton.d.ts +3 -1
- package/vanilla/UiButton.js +3 -3
- package/vanilla/UiCallout.d.ts +1 -1
- package/vanilla/UiCallout.js +2 -2
- package/vanilla/UiCheckbox.d.ts +1 -1
- package/vanilla/UiCheckbox.js +2 -2
- package/vanilla/UiCluster.d.ts +1 -1
- package/vanilla/UiCluster.js +2 -2
- package/vanilla/UiCombobox.d.ts +1 -1
- package/vanilla/UiCombobox.js +3 -3
- package/vanilla/UiContainer.d.ts +1 -1
- package/vanilla/UiContainer.js +2 -2
- package/vanilla/UiContextMenu.d.ts +1 -1
- package/vanilla/UiContextMenu.js +2 -2
- package/vanilla/UiDialog.d.ts +1 -1
- package/vanilla/UiDialog.js +2 -2
- package/vanilla/UiDisclosure.d.ts +1 -1
- package/vanilla/UiDisclosure.js +2 -2
- package/vanilla/UiEditable.d.ts +1 -1
- package/vanilla/UiEditable.js +2 -2
- package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
- package/vanilla/UiEditorInsertTableGrid.js +3 -3
- package/vanilla/UiEditorMentionMenu.d.ts +1 -1
- package/vanilla/UiEditorMentionMenu.js +3 -3
- package/vanilla/UiEditorSlashMenu.d.ts +1 -1
- package/vanilla/UiEditorSlashMenu.js +2 -2
- package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
- package/vanilla/UiEditorTableContextMenu.js +3 -3
- package/vanilla/UiEditorTableOverlay.d.ts +1 -1
- package/vanilla/UiEditorTableOverlay.js +3 -3
- package/vanilla/UiEditorTableToolbar.d.ts +1 -1
- package/vanilla/UiEditorTableToolbar.js +3 -3
- package/vanilla/UiEditorToolbar.d.ts +1 -1
- package/vanilla/UiEditorToolbar.js +2 -2
- package/vanilla/UiFloatingActionButton.d.ts +1 -1
- package/vanilla/UiFloatingActionButton.js +2 -2
- package/vanilla/UiFormField.d.ts +1 -1
- package/vanilla/UiFormField.js +15 -6
- package/vanilla/UiGrid.d.ts +1 -1
- package/vanilla/UiGrid.js +2 -2
- package/vanilla/UiIcon.d.ts +1 -1
- package/vanilla/UiIcon.js +3 -3
- package/vanilla/UiIconButton.d.ts +1 -1
- package/vanilla/UiIconButton.js +2 -2
- package/vanilla/UiInput.d.ts +1 -1
- package/vanilla/UiInput.js +2 -2
- package/vanilla/UiMenu.d.ts +1 -1
- package/vanilla/UiMenu.js +2 -2
- package/vanilla/UiMenuItem.d.ts +1 -1
- package/vanilla/UiMenuItem.js +2 -2
- package/vanilla/UiPopover.d.ts +1 -1
- package/vanilla/UiPopover.js +2 -2
- package/vanilla/UiRadio.d.ts +1 -1
- package/vanilla/UiRadio.js +2 -2
- package/vanilla/UiRadioGroup.d.ts +1 -1
- package/vanilla/UiRadioGroup.js +2 -2
- package/vanilla/UiReel.d.ts +1 -1
- package/vanilla/UiReel.js +2 -2
- package/vanilla/UiSearchResultRow.d.ts +1 -1
- package/vanilla/UiSearchResultRow.js +2 -2
- package/vanilla/UiSearchShell.d.ts +1 -1
- package/vanilla/UiSearchShell.js +2 -2
- package/vanilla/UiSelect.d.ts +1 -1
- package/vanilla/UiSelect.js +2 -2
- package/vanilla/UiSeparator.d.ts +1 -1
- package/vanilla/UiSeparator.js +2 -2
- package/vanilla/UiSidebar.d.ts +1 -1
- package/vanilla/UiSidebar.js +2 -2
- package/vanilla/UiStack.d.ts +1 -1
- package/vanilla/UiStack.js +2 -2
- package/vanilla/UiSwitch.d.ts +1 -1
- package/vanilla/UiSwitch.js +2 -2
- package/vanilla/UiSwitcher.d.ts +1 -1
- package/vanilla/UiSwitcher.js +2 -2
- package/vanilla/UiTabs.d.ts +1 -1
- package/vanilla/UiTabs.js +3 -3
- package/vanilla/UiTextarea.d.ts +1 -1
- package/vanilla/UiTextarea.js +2 -2
- package/vanilla/UiToastRegion.d.ts +1 -1
- package/vanilla/UiToastRegion.js +3 -3
- package/vanilla/UiTooltip.d.ts +1 -1
- package/vanilla/UiTooltip.js +2 -2
- package/vanilla/UiTopBar.d.ts +1 -1
- package/vanilla/UiTopBar.js +1 -1
- package/vanilla/UiTree.d.ts +1 -1
- package/vanilla/UiTree.js +2 -2
- package/vanilla/UiTreeItem.d.ts +1 -1
- package/vanilla/UiTreeItem.js +2 -2
- package/vue/UiAffordanceScope.d.ts +2 -2
- package/vue/UiAffordanceScope.vue +92 -73
- package/vue/UiAvatar.d.ts +7 -7
- package/vue/UiAvatar.vue +145 -105
- package/vue/UiAvatarGroup.d.ts +4 -4
- package/vue/UiAvatarGroup.vue +134 -118
- package/vue/UiBadge.d.ts +4 -4
- package/vue/UiBadge.vue +113 -114
- package/vue/UiButton.d.ts +10 -6
- package/vue/UiButton.vue +289 -248
- package/vue/UiCallout.d.ts +2 -2
- package/vue/UiCallout.vue +154 -87
- package/vue/UiCheckbox.d.ts +14 -10
- package/vue/UiCheckbox.vue +228 -162
- package/vue/UiCluster.d.ts +2 -2
- package/vue/UiCluster.vue +53 -60
- package/vue/UiCombobox.d.ts +36 -32
- package/vue/UiCombobox.vue +1005 -416
- package/vue/UiContainer.d.ts +2 -2
- package/vue/UiContainer.vue +48 -51
- package/vue/UiContextMenu.d.ts +6 -4
- package/vue/UiContextMenu.vue +205 -116
- package/vue/UiDialog.d.ts +11 -9
- package/vue/UiDialog.vue +287 -212
- package/vue/UiDisclosure.d.ts +8 -6
- package/vue/UiDisclosure.vue +248 -159
- package/vue/UiEditable.d.ts +16 -12
- package/vue/UiEditable.vue +325 -205
- package/vue/UiEditorInsertTableGrid.d.ts +8 -8
- package/vue/UiEditorInsertTableGrid.vue +216 -157
- package/vue/UiEditorMentionMenu.d.ts +9 -9
- package/vue/UiEditorMentionMenu.vue +265 -222
- package/vue/UiEditorSlashMenu.d.ts +7 -7
- package/vue/UiEditorSlashMenu.vue +286 -240
- package/vue/UiEditorTableContextMenu.d.ts +5 -5
- package/vue/UiEditorTableContextMenu.vue +306 -193
- package/vue/UiEditorTableOverlay.d.ts +2 -2
- package/vue/UiEditorTableOverlay.vue +609 -369
- package/vue/UiEditorTableToolbar.d.ts +7 -7
- package/vue/UiEditorTableToolbar.vue +443 -268
- package/vue/UiEditorToolbar.d.ts +2 -2
- package/vue/UiEditorToolbar.vue +134 -121
- package/vue/UiFloatingActionButton.d.ts +6 -6
- package/vue/UiFloatingActionButton.vue +100 -99
- package/vue/UiFormField.d.ts +6 -6
- package/vue/UiFormField.vue +112 -80
- package/vue/UiGrid.d.ts +2 -2
- package/vue/UiGrid.vue +51 -57
- package/vue/UiIcon.d.ts +2 -2
- package/vue/UiIcon.vue +118 -89
- package/vue/UiIconButton.d.ts +11 -11
- package/vue/UiIconButton.vue +283 -217
- package/vue/UiInput.d.ts +9 -9
- package/vue/UiInput.vue +153 -127
- package/vue/UiMenu.d.ts +8 -6
- package/vue/UiMenu.vue +217 -143
- package/vue/UiMenuItem.d.ts +4 -4
- package/vue/UiMenuItem.vue +52 -46
- package/vue/UiPopover.d.ts +8 -6
- package/vue/UiPopover.vue +197 -137
- package/vue/UiRadio.d.ts +14 -10
- package/vue/UiRadio.vue +183 -117
- package/vue/UiRadioGroup.d.ts +14 -12
- package/vue/UiRadioGroup.vue +172 -111
- package/vue/UiReel.d.ts +3 -3
- package/vue/UiReel.vue +77 -77
- package/vue/UiSearchResultRow.d.ts +4 -4
- package/vue/UiSearchResultRow.vue +124 -115
- package/vue/UiSearchShell.d.ts +10 -8
- package/vue/UiSearchShell.vue +245 -176
- package/vue/UiSelect.d.ts +9 -9
- package/vue/UiSelect.vue +162 -134
- package/vue/UiSeparator.d.ts +2 -2
- package/vue/UiSeparator.vue +22 -27
- package/vue/UiSidebar.d.ts +20 -18
- package/vue/UiSidebar.vue +312 -224
- package/vue/UiStack.d.ts +3 -3
- package/vue/UiStack.vue +64 -70
- package/vue/UiSwitch.d.ts +12 -8
- package/vue/UiSwitch.vue +218 -150
- package/vue/UiSwitcher.d.ts +3 -3
- package/vue/UiSwitcher.vue +73 -75
- package/vue/UiTabs.d.ts +10 -8
- package/vue/UiTabs.vue +251 -210
- package/vue/UiTextarea.d.ts +11 -11
- package/vue/UiTextarea.vue +155 -128
- package/vue/UiToastRegion.d.ts +10 -8
- package/vue/UiToastRegion.vue +261 -198
- package/vue/UiTooltip.d.ts +14 -12
- package/vue/UiTooltip.vue +241 -177
- package/vue/UiTopBar.vue +51 -42
- package/vue/UiTree.d.ts +8 -6
- package/vue/UiTree.vue +157 -70
- package/vue/UiTreeItem.d.ts +24 -22
- package/vue/UiTreeItem.vue +456 -339
- package/vue/chunks/UiAffordanceScope.js +9 -16
- package/vue/chunks/UiAvatar.js +23 -29
- package/vue/chunks/UiAvatarGroup.js +16 -39
- package/vue/chunks/UiBadge.js +3 -12
- package/vue/chunks/UiButton.js +15 -18
- package/vue/chunks/UiCallout.js +8 -17
- package/vue/chunks/UiCheckbox.js +37 -40
- package/vue/chunks/UiCluster.js +3 -12
- package/vue/chunks/UiCombobox.js +224 -266
- package/vue/chunks/UiContainer.js +3 -12
- package/vue/chunks/UiContextMenu.js +39 -34
- package/vue/chunks/UiDialog.js +36 -39
- package/vue/chunks/UiDisclosure.js +43 -48
- package/vue/chunks/UiEditable.js +55 -57
- package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
- package/vue/chunks/UiEditorMentionMenu.js +40 -81
- package/vue/chunks/UiEditorSlashMenu.js +28 -52
- package/vue/chunks/UiEditorTableContextMenu.js +32 -56
- package/vue/chunks/UiEditorTableOverlay.js +58 -82
- package/vue/chunks/UiEditorTableToolbar.js +61 -85
- package/vue/chunks/UiEditorToolbar.js +4 -13
- package/vue/chunks/UiFloatingActionButton.js +7 -21
- package/vue/chunks/UiFormField.js +15 -12
- package/vue/chunks/UiGrid.js +3 -12
- package/vue/chunks/UiIcon.js +20 -43
- package/vue/chunks/UiIconButton.js +16 -28
- package/vue/chunks/UiInput.js +20 -25
- package/vue/chunks/UiMenu.js +29 -33
- package/vue/chunks/UiMenuItem.js +4 -10
- package/vue/chunks/UiPopover.js +28 -29
- package/vue/chunks/UiRadio.js +36 -39
- package/vue/chunks/UiRadioGroup.js +30 -34
- package/vue/chunks/UiReel.js +6 -15
- package/vue/chunks/UiSearchResultRow.js +6 -19
- package/vue/chunks/UiSearchShell.js +25 -28
- package/vue/chunks/UiSelect.js +20 -23
- package/vue/chunks/UiSeparator.js +2 -8
- package/vue/chunks/UiSidebar.js +39 -44
- package/vue/chunks/UiStack.js +6 -15
- package/vue/chunks/UiSwitch.js +35 -38
- package/vue/chunks/UiSwitcher.js +6 -15
- package/vue/chunks/UiTabs.js +47 -85
- package/vue/chunks/UiTextarea.js +21 -26
- package/vue/chunks/UiToastRegion.js +38 -72
- package/vue/chunks/UiTooltip.js +34 -35
- package/vue/chunks/UiTopBar.js +1 -1
- package/vue/chunks/UiTree.js +20 -15
- package/vue/chunks/UiTreeItem.js +85 -102
- package/vue/components.css +3994 -3801
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@ The editor components' event and geometry types, without Tiptap, are in
|
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Importing the package registers every component with the
|
|
45
|
-
[HTML Next runtime](https://www.npmjs.com/package/@nextwebwg/
|
|
45
|
+
[HTML Next runtime](https://www.npmjs.com/package/@nextwebwg/html-next), which turns
|
|
46
46
|
each `<ui-*>` element into its native root. Each component's styles are scoped to it; the token
|
|
47
47
|
stylesheet is the only stylesheet to include. Without a build, link components one by one from
|
|
48
48
|
`@threadlabs/looma/components/<tag>/<tag>.html`.
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
>Visual emphasis and semantic intent. link is an inline text action that reads as a link.</prop>
|
|
5
5
|
<prop name="size" type="sm | md | lg" default="md">Control size.</prop>
|
|
6
6
|
<prop name="disabled" type="boolean" default="false">disabled token.</prop>
|
|
7
|
+
<prop name="align" type="center | start" default="center"
|
|
8
|
+
>Content alignment. start lays the content out like a list option: from the start edge, with start-aligned text.</prop>
|
|
9
|
+
<prop name="stretch" type="boolean" default="false">Fills the inline size of its container.</prop>
|
|
7
10
|
</defs>
|
|
8
11
|
<button type="button" :disabled="disabled"><slot></slot></button>
|
|
9
12
|
<style>
|
|
@@ -19,6 +22,16 @@
|
|
|
19
22
|
color: var(--ui-action-primary-text, var(--ui-text-on-accent));
|
|
20
23
|
}
|
|
21
24
|
|
|
25
|
+
:host-state([align="start"]) {
|
|
26
|
+
justify-content: flex-start;
|
|
27
|
+
text-align: start;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:host-state([stretch]) {
|
|
31
|
+
display: flex;
|
|
32
|
+
inline-size: 100%;
|
|
33
|
+
}
|
|
34
|
+
|
|
22
35
|
:host {
|
|
23
36
|
appearance: none;
|
|
24
37
|
min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md, 2.5rem));
|
|
@@ -23,16 +23,24 @@
|
|
|
23
23
|
<prop name="help" type="string" default="">help token.</prop>
|
|
24
24
|
<state name="raw" :value="''"></state>
|
|
25
25
|
<state name="display" :value="''"></state>
|
|
26
|
-
<state name="selected" :value="null"></state>
|
|
26
|
+
<state name="selected" type="string | null" :value="null"></state>
|
|
27
27
|
<state name="expanded" :value="false"></state>
|
|
28
|
-
<state name="rows" :value="[]"></state>
|
|
28
|
+
<state name="rows" type="list(object({ id: string, value: string, label: string, group?: string, disabled: boolean }))" :value="[]"></state>
|
|
29
29
|
<state name="active" :value="-1"></state>
|
|
30
30
|
<state name="loading" :value="false"></state>
|
|
31
31
|
<state name="helpOpen" :value="false"></state>
|
|
32
32
|
<state name="lookupError" :value="''"></state>
|
|
33
|
-
<state
|
|
33
|
+
<state
|
|
34
|
+
name="validation"
|
|
35
|
+
type="object({ status: pristine | pending | valid | warning | error, touched: boolean, dirty: boolean, issues: list(object({ message: string })), ... })"
|
|
36
|
+
:value="{ status: 'pristine', touched: false, dirty: false, issues: [] }"
|
|
37
|
+
></state>
|
|
34
38
|
<state name="uid" :value="''"></state>
|
|
35
|
-
<state
|
|
39
|
+
<state
|
|
40
|
+
name="groups"
|
|
41
|
+
type="list(object({ name: string, role: group | presentation, label: string | null, rows: list(object({ id: string, value: string, label: string, group?: string, disabled: boolean, index: integer })) }))"
|
|
42
|
+
:value="[]"
|
|
43
|
+
></state>
|
|
36
44
|
<state name="creatable" :value="false"></state>
|
|
37
45
|
<state name="createIndex" :value="0"></state>
|
|
38
46
|
<state name="message" :value="''"></state>
|
|
@@ -127,6 +127,19 @@
|
|
|
127
127
|
outline-offset: 2px;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
/* A touch target, like Button on coarse pointers. */
|
|
131
|
+
@media (pointer: coarse) {
|
|
132
|
+
.close {
|
|
133
|
+
inline-size: var(--ui-control-min-block-size, 2.75rem);
|
|
134
|
+
block-size: var(--ui-control-min-block-size, 2.75rem);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
html[data-ui-input-modality="touch"] :host .close {
|
|
139
|
+
inline-size: var(--ui-control-min-block-size, 2.75rem);
|
|
140
|
+
block-size: var(--ui-control-min-block-size, 2.75rem);
|
|
141
|
+
}
|
|
142
|
+
|
|
130
143
|
.body {
|
|
131
144
|
flex: 1 1 auto;
|
|
132
145
|
min-block-size: 0;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<prop name="maxRows" type="integer" default="8">The most rows the grid offers (at most 10).</prop>
|
|
5
5
|
<prop name="maxCols" type="integer" default="8">The most columns the grid offers (at most 10).</prop>
|
|
6
6
|
<prop name="headerRow" type="boolean" default="false">Whether table insertion initially includes a header row.</prop>
|
|
7
|
-
<state name="cells" :value="[]"></state>
|
|
7
|
+
<state name="cells" type="list(object({ key: string, row: integer, col: integer, label: string, selected: boolean }))" :value="[]"></state>
|
|
8
8
|
<state name="rows" :value="8"></state>
|
|
9
9
|
<state name="cols" :value="8"></state>
|
|
10
10
|
<state name="hint" :value="''"></state>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
type="object({ left?: number, top?: number, right?: number, bottom?: number, x?: number, y?: number, width?: number, height?: number }) | null"
|
|
11
11
|
>Where the @ was typed, in viewport coordinates.</prop>
|
|
12
12
|
<state name="visible" :value="false"></state>
|
|
13
|
-
<state name="rows" :value="[]"></state>
|
|
13
|
+
<state name="rows" type="list(object({ id: string, label: string, detail?: string, initials: string }))" :value="[]"></state>
|
|
14
14
|
<state name="searching" :value="false"></state>
|
|
15
15
|
<state name="active" :value="0"></state>
|
|
16
16
|
<state name="prefix" :value="'ui-editor-mention-menu'"></state>
|
|
@@ -7,8 +7,12 @@
|
|
|
7
7
|
name="actions"
|
|
8
8
|
type="list(align-left | align-center | align-right | background-none | background-gray | background-yellow | background-blue | background-green | background-red | add-row-before | add-row-after | add-column-before | add-column-after | clear-cells | merge-cells | split-cell | delete-row | delete-column | delete-table)"
|
|
9
9
|
>The complete set of commands the current selection permits.</prop>
|
|
10
|
-
<state name="swatches" :value="[]"></state>
|
|
11
|
-
<state
|
|
10
|
+
<state name="swatches" type="list(object({ action: string, label: string, color: string, selected: boolean })) | null" :value="[]"></state>
|
|
11
|
+
<state
|
|
12
|
+
name="sections"
|
|
13
|
+
type="list(object({ heading: string, items: list(object({ action: string, label: string, icon: string, danger: boolean })) }))"
|
|
14
|
+
:value="[]"
|
|
15
|
+
></state>
|
|
12
16
|
<event
|
|
13
17
|
name="action"
|
|
14
18
|
type="object({ action: align-left | align-center | align-right | background-none | background-gray | background-yellow | background-blue | background-green | background-red | add-row-before | add-row-after | add-column-before | add-column-after | clear-cells | merge-cells | split-cell | delete-row | delete-column | delete-table })"
|
|
@@ -6,10 +6,26 @@
|
|
|
6
6
|
name="geometry"
|
|
7
7
|
type="object({ rowBoundaries: list(number), columnBoundaries: list(number), activeCell: object({ left: number, top: number, width: number, height: number, rowIndex: integer, columnIndex: integer }) | null, hoveredCell?: object({ left: number, top: number, width: number, height: number, rowIndex: integer, columnIndex: integer }) | null }) | null"
|
|
8
8
|
>The authoritative editor-measured table boundaries and active or hovered cell rectangles.</prop>
|
|
9
|
-
<state
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
<state
|
|
10
|
+
name="rows"
|
|
11
|
+
type="list(object({ key: string, index: integer, offset: string, affordance: insert-row | insert-column, action: add-row-before | add-row-after | add-column-before | add-column-after, label: string }))"
|
|
12
|
+
:value="[]"
|
|
13
|
+
></state>
|
|
14
|
+
<state
|
|
15
|
+
name="cols"
|
|
16
|
+
type="list(object({ key: string, index: integer, offset: string, affordance: insert-row | insert-column, action: add-row-before | add-row-after | add-column-before | add-column-after, label: string }))"
|
|
17
|
+
:value="[]"
|
|
18
|
+
></state>
|
|
19
|
+
<state
|
|
20
|
+
name="hovered"
|
|
21
|
+
type="object({ left: number, top: number, width: number, height: number, rowIndex: integer, columnIndex: integer, rowOffset: string, columnOffset: string }) | null"
|
|
22
|
+
:value="null"
|
|
23
|
+
></state>
|
|
24
|
+
<state
|
|
25
|
+
name="active"
|
|
26
|
+
type="object({ left: number, top: number, width: number, height: number, rowIndex: integer, columnIndex: integer, menuLeft: string, menuTop: string }) | null"
|
|
27
|
+
:value="null"
|
|
28
|
+
></state>
|
|
13
29
|
<state name="activeKey" :value="''"></state>
|
|
14
30
|
<event
|
|
15
31
|
name="action"
|
|
@@ -8,10 +8,14 @@
|
|
|
8
8
|
name="actions"
|
|
9
9
|
type="list(align-left | align-center | align-right | background-none | background-gray | background-yellow | background-blue | background-green | background-red | add-row-before | add-row-after | add-column-before | add-column-after | clear-cells | merge-cells | split-cell | delete-row | delete-column | delete-table)"
|
|
10
10
|
>The complete set of commands the current selection permits.</prop>
|
|
11
|
-
<state name="alignments" :value="[]"></state>
|
|
12
|
-
<state name="structure" :value="[]"></state>
|
|
13
|
-
<state name="swatches" :value="[]"></state>
|
|
14
|
-
<state
|
|
11
|
+
<state name="alignments" type="list(object({ action: align-left | align-center | align-right, label: string, active: boolean }))" :value="[]"></state>
|
|
12
|
+
<state name="structure" type="list(object({ action: add-row-after | add-column-after, label: string, icon: string }))" :value="[]"></state>
|
|
13
|
+
<state name="swatches" type="list(object({ action: string, label: string, color: string, selected: boolean }))" :value="[]"></state>
|
|
14
|
+
<state
|
|
15
|
+
name="sections"
|
|
16
|
+
type="list(object({ heading: string, items: list(object({ action: string, label: string, icon: string, danger: boolean })) }))"
|
|
17
|
+
:value="[]"
|
|
18
|
+
></state>
|
|
15
19
|
<state name="hasOverflow" :value="false"></state>
|
|
16
20
|
<state name="overflowOpen" :value="false"></state>
|
|
17
21
|
<event
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
<prop name="required" type="boolean" default="false">required token.</prop>
|
|
6
6
|
</defs>
|
|
7
7
|
<div>
|
|
8
|
-
<slot name="label"></slot>
|
|
8
|
+
<div class="label"><slot name="label"></slot></div>
|
|
9
9
|
<slot></slot>
|
|
10
|
-
<slot name="help"></slot>
|
|
11
|
-
<slot name="error"></slot>
|
|
10
|
+
<div class="help"><slot name="help"></slot></div>
|
|
11
|
+
<div class="error"><slot name="error"></slot></div>
|
|
12
12
|
</div>
|
|
13
13
|
<style>
|
|
14
14
|
:host {
|
|
@@ -19,19 +19,30 @@
|
|
|
19
19
|
color: var(--ui-text-primary);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
/* Each named region styles whatever fills it, however it was slotted (slot="…" in HTML, #label
|
|
23
|
+
in Vue), and generates no box of its own, so an empty region adds no gap. */
|
|
24
|
+
.label,
|
|
25
|
+
.help,
|
|
26
|
+
.error {
|
|
27
|
+
display: contents;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.label {
|
|
23
31
|
color: var(--ui-text-secondary);
|
|
24
32
|
font-size: 0.95rem;
|
|
25
33
|
}
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
min-block-size: var(--ui-form-field-help-min-block-size, 0);
|
|
35
|
+
.help {
|
|
29
36
|
color: var(--ui-text-muted);
|
|
30
37
|
font-size: 0.875rem;
|
|
31
38
|
line-height: var(--ui-line-height-md);
|
|
32
39
|
}
|
|
33
40
|
|
|
34
|
-
:slotted(
|
|
41
|
+
.help > :slotted(*) {
|
|
42
|
+
min-block-size: var(--ui-form-field-help-min-block-size, 0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.error,
|
|
35
46
|
:slotted([role="alert"]) {
|
|
36
47
|
color: var(--ui-accent-active);
|
|
37
48
|
font-size: 0.875rem;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
<template component="ui-icon" controller="./ui-icon.js">
|
|
2
2
|
<defs>
|
|
3
3
|
<prop name="name" type="string" default="">The icon's name.</prop>
|
|
4
|
-
<state
|
|
4
|
+
<state
|
|
5
|
+
name="shapes"
|
|
6
|
+
type="list(object({ tag: path | circle | rect, d?: string, cx?: string, cy?: string, r?: string, x?: string, y?: string, width?: string, height?: string, rx?: string }))"
|
|
7
|
+
:value="[]"
|
|
8
|
+
></state>
|
|
5
9
|
</defs>
|
|
6
10
|
<span aria-hidden="true">
|
|
7
11
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false">
|
|
@@ -79,6 +79,36 @@
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/* A touch target without a bigger button: an invisible hit area, at least the control
|
|
83
|
+
minimum, centred on the button (::before is the anticipatory guide). */
|
|
84
|
+
@media (pointer: coarse) {
|
|
85
|
+
:host {
|
|
86
|
+
position: relative;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:host::after {
|
|
90
|
+
content: "";
|
|
91
|
+
position: absolute;
|
|
92
|
+
inset: 50% auto auto 50%;
|
|
93
|
+
inline-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
|
|
94
|
+
block-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
|
|
95
|
+
transform: translate(-50%, -50%);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
html[data-ui-input-modality="touch"] :host {
|
|
100
|
+
position: relative;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
html[data-ui-input-modality="touch"] :host::after {
|
|
104
|
+
content: "";
|
|
105
|
+
position: absolute;
|
|
106
|
+
inset: 50% auto auto 50%;
|
|
107
|
+
inline-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
|
|
108
|
+
block-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
|
|
109
|
+
transform: translate(-50%, -50%);
|
|
110
|
+
}
|
|
111
|
+
|
|
82
112
|
:host-state([size="sm"]) {
|
|
83
113
|
inline-size: var(--ui-icon-button-size-sm, 1.75rem);
|
|
84
114
|
block-size: var(--ui-icon-button-size-sm, 1.75rem);
|
|
@@ -14,11 +14,19 @@ export default function controller(host) {
|
|
|
14
14
|
|
|
15
15
|
const close = (reason, trigger) => {
|
|
16
16
|
host.state.internalOpen = false;
|
|
17
|
+
lastOpen = false;
|
|
17
18
|
host.dispatch("close", { open: false, reason, trigger });
|
|
18
19
|
};
|
|
19
20
|
const onAnchorClick = (event) => {
|
|
20
|
-
|
|
21
|
-
if (
|
|
21
|
+
const trigger = event.detail === 0 ? "keyboard" : "pointer";
|
|
22
|
+
if (host.state.internalOpen) {
|
|
23
|
+
close("action", trigger);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
host.state.internalOpen = true;
|
|
27
|
+
// Announce the anchor's toggle once, with its real trigger; apply() only announces changes it made.
|
|
28
|
+
lastOpen = true;
|
|
29
|
+
host.dispatch("open", { open: true, reason: "action", trigger });
|
|
22
30
|
};
|
|
23
31
|
const ids = createIdResolver(document, () => apply());
|
|
24
32
|
const setup = () => {
|
|
@@ -64,6 +64,13 @@
|
|
|
64
64
|
.search {
|
|
65
65
|
padding: var(--ui-space-3);
|
|
66
66
|
border-block-end: 1px solid var(--ui-border-default);
|
|
67
|
+
transition: border-color var(--ui-motion-fast) var(--ui-motion-ease), box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* The search region shows where typing goes, whatever the author put in it. */
|
|
71
|
+
.search:focus-within {
|
|
72
|
+
border-block-end-color: var(--ui-search-shell-focus-color, var(--ui-control-focus));
|
|
73
|
+
box-shadow: inset 0 -1px 0 var(--ui-search-shell-focus-color, var(--ui-control-focus));
|
|
67
74
|
}
|
|
68
75
|
|
|
69
76
|
:slotted(input[slot="search"]) {
|
|
@@ -40,6 +40,13 @@ export default function controller(host) {
|
|
|
40
40
|
event.preventDefault();
|
|
41
41
|
if (host.state.dismissible) dispatchClose("escape", "keyboard");
|
|
42
42
|
};
|
|
43
|
+
// A search field spends the first Escape clearing itself and the dialog never sees a cancel,
|
|
44
|
+
// so a dismissible shell closes on Escape from anywhere inside it.
|
|
45
|
+
const onKeydown = (event) => {
|
|
46
|
+
if (event.key !== "Escape" || event.defaultPrevented || !host.state.dismissible) return;
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
dispatchClose("escape", "keyboard");
|
|
49
|
+
};
|
|
43
50
|
const onClick = (event) => {
|
|
44
51
|
if (host.state.dismissible && event.target === dialog) dispatchClose("light-dismiss", trigger());
|
|
45
52
|
};
|
|
@@ -47,12 +54,14 @@ export default function controller(host) {
|
|
|
47
54
|
if (!suppressNativeClose && host.state.internalOpen) dispatchClose("action", trigger());
|
|
48
55
|
};
|
|
49
56
|
dialog.addEventListener("cancel", onCancel);
|
|
57
|
+
dialog.addEventListener("keydown", onKeydown);
|
|
50
58
|
dialog.addEventListener("click", onClick);
|
|
51
59
|
dialog.addEventListener("close", onClose);
|
|
52
60
|
return () => {
|
|
53
61
|
stop();
|
|
54
62
|
stopTracking();
|
|
55
63
|
dialog.removeEventListener("cancel", onCancel);
|
|
64
|
+
dialog.removeEventListener("keydown", onKeydown);
|
|
56
65
|
dialog.removeEventListener("click", onClick);
|
|
57
66
|
dialog.removeEventListener("close", onClose);
|
|
58
67
|
closeNative();
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<prop name="orientation" type="horizontal | vertical" default="horizontal">orientation token.</prop>
|
|
6
6
|
<prop name="stretch" type="boolean" default="false">Share the full width of the tab list equally between tabs instead of sizing each to its label.</prop>
|
|
7
7
|
<state name="internalValue" :value="''"></state>
|
|
8
|
-
<state name="tabs" :value="[]"></state>
|
|
8
|
+
<state name="tabs" type="list(object({ id: string, label: string }))" :value="[]"></state>
|
|
9
9
|
<event name="select" type="object({ value: string, previousValue: string, trigger: keyboard | pointer | programmatic })"></event>
|
|
10
10
|
</defs>
|
|
11
11
|
<div>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
>Dismiss each message automatically after its duration. Timers pause while the pointer or focus is on a message.</prop>
|
|
8
8
|
<prop name="duration" type="number" default="5000">Milliseconds an automatically dismissed message stays visible.</prop>
|
|
9
9
|
<state name="internalOpen" :value="false"></state>
|
|
10
|
-
<state name="toasts" :value="[]"></state>
|
|
10
|
+
<state name="toasts" type="list(object({ id: string, message: string, role: alert | status, closing: boolean }))" :value="[]"></state>
|
|
11
11
|
<event
|
|
12
12
|
name="close"
|
|
13
13
|
type="object({ open: boolean, reason: action | timeout | programmatic | light-dismiss | escape, trigger: keyboard | pointer | programmatic })"
|
|
@@ -209,11 +209,16 @@
|
|
|
209
209
|
flex: none;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
/* The label spans the row's height and centres its content, so slotted content (a link) can
|
|
213
|
+
stretch to fill the row as its own hit area; the padding tokens remove the inset. */
|
|
212
214
|
.label {
|
|
213
215
|
grid-column: 3;
|
|
214
216
|
grid-row: 1;
|
|
217
|
+
align-self: stretch;
|
|
218
|
+
display: flex;
|
|
219
|
+
align-items: center;
|
|
215
220
|
min-inline-size: 0;
|
|
216
|
-
padding: var(--ui-space-1) var(--ui-space-2);
|
|
221
|
+
padding: var(--ui-tree-label-padding-block, var(--ui-space-1)) var(--ui-tree-label-padding-inline, var(--ui-space-2));
|
|
217
222
|
}
|
|
218
223
|
|
|
219
224
|
.actions {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ComponentDefinition } from "@nextwebwg/
|
|
1
|
+
import type { ComponentDefinition } from "@nextwebwg/html-next";
|
|
2
2
|
export declare const definitions: readonly ComponentDefinition[];
|
|
3
3
|
export declare function register(root?: Document): () => void;
|
|
4
4
|
export declare const stop: undefined | (() => void);
|