@threadlabs/looma 0.37.5 → 0.38.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.
- package/components/ui-button/ui-button.html +20 -5
- package/components/ui-combobox/ui-combobox.html +24 -3
- package/components/ui-combobox/ui-combobox.js +18 -3
- package/components/ui-icon-button/ui-icon-button.html +17 -8
- package/components/ui-menu-item/ui-menu-item.html +6 -1
- package/components/ui-select/ui-select.html +12 -0
- package/components/ui-skeleton/ui-skeleton.html +91 -0
- package/dist/index.js +1 -1
- package/docs/README.md +23 -10
- package/docs/catalog.json +246 -31
- package/docs/customizer-render.mjs +36 -20
- package/docs/customizer.js +76 -25
- package/docs/documentation.css +2 -0
- package/docs/palette.mjs +3 -3
- package/docs/site.mjs +1 -1
- package/docs/theme-session.mjs +1 -0
- package/docs/theme.mjs +11 -10
- package/package.json +2 -2
- package/styles/ui-button.css +19 -9
- package/styles/ui-combobox.css +40 -2
- package/styles/ui-icon-button.css +12 -2
- package/styles/ui-menu-item.css +6 -1
- package/styles/ui-select.css +9 -0
- package/styles/ui-skeleton.css +91 -0
- package/theme-system.css +7 -2
- package/vanilla/UiButton.js +1 -1
- package/vanilla/UiCombobox.d.ts +1 -0
- package/vanilla/UiCombobox.js +38 -37
- package/vanilla/UiIconButton.d.ts +1 -1
- package/vanilla/UiIconButton.js +1 -1
- package/vanilla/UiSelect.d.ts +1 -0
- package/vanilla/UiSelect.js +7 -7
- package/vanilla/UiSkeleton.d.ts +26 -0
- package/vanilla/UiSkeleton.js +42 -0
- package/vanilla/index.js +1 -0
- package/vue/UiButton.vue +30 -12
- package/vue/UiCombobox.d.ts +6 -0
- package/vue/UiCombobox.vue +70 -6
- package/vue/UiIconButton.d.ts +2 -2
- package/vue/UiIconButton.vue +23 -18
- package/vue/UiMenuItem.vue +6 -1
- package/vue/UiSelect.d.ts +6 -0
- package/vue/UiSelect.vue +30 -1
- package/vue/UiSkeleton.d.ts +37 -0
- package/vue/UiSkeleton.js +2 -0
- package/vue/UiSkeleton.vue +235 -0
- package/vue/chunks/UiButton.js +4 -4
- package/vue/chunks/UiCombobox.js +72 -46
- package/vue/chunks/UiIconButton.js +6 -7
- package/vue/chunks/UiMenuItem.js +1 -1
- package/vue/chunks/UiSelect.js +27 -2
- package/vue/chunks/UiSkeleton.js +151 -0
- package/vue/components.css +197 -25
- package/vue/editor/index.js +2 -3
- package/vue/index.d.ts +1 -0
- package/vue/index.js +2 -1
package/docs/README.md
CHANGED
|
@@ -12,7 +12,7 @@ In a project with a `package.json`, install Looma and its documentation tools:
|
|
|
12
12
|
|
|
13
13
|
```sh
|
|
14
14
|
pnpm add @threadlabs/looma @nextwebwg/html-next@1.0.0-alpha.69
|
|
15
|
-
pnpm add -D markupress@^0.9.
|
|
15
|
+
pnpm add -D markupress@^0.9.1 @nextwebwg/htmlkit@1.0.0-alpha.69 vite
|
|
16
16
|
pnpm exec looma-docs init --title "The Fellowship"
|
|
17
17
|
pnpm exec looma-docs dev
|
|
18
18
|
```
|
|
@@ -33,6 +33,12 @@ The CSS includes generated derivation rules as well as values. Re-export or save
|
|
|
33
33
|
|
|
34
34
|
Open the local address printed by `dev`, choose **Customize**, and save your theme. Saving updates those shared theme files and rebuilds the documentation. Your application consumes the same CSS import. A static or public site instead offers CSS and recipe downloads.
|
|
35
35
|
|
|
36
|
+
Starting points set a complete identity across color, typography, shape, spacing,
|
|
37
|
+
material and motion. Palette and material refinements then change only their own
|
|
38
|
+
families. The compact sampler includes heading, body and supporting text beside
|
|
39
|
+
the controls. Search components searches your whole discovered catalog; nine
|
|
40
|
+
previews render initially, and **Show more components** reveals the next group.
|
|
41
|
+
|
|
36
42
|
```sh
|
|
37
43
|
pnpm exec looma-docs build
|
|
38
44
|
pnpm exec looma-docs preview
|
|
@@ -74,15 +80,15 @@ under `theme`; changing a site title does not require renaming those files.
|
|
|
74
80
|
|
|
75
81
|
## Change the rule, keep the family consistent
|
|
76
82
|
|
|
77
|
-
The authoring model groups shared decisions as Colour, Type, Size & spacing, Material and Motion. The controls expose shared intent: control roominess relative to text, spacing, corners, inner and outer depth, and response pace.
|
|
83
|
+
The authoring model groups shared decisions as Colour, Type, Size & spacing, Material and Motion. The controls expose shared intent: control roominess relative to text, rhythm, spacing, corners, inner and outer depth, and response pace.
|
|
78
84
|
|
|
79
|
-
The generated values follow rules. The medium control height is base text size times control roominess; small and large heights follow the size ratio. Touch does not inflate the visible size ladder. Hit-area guidance is contextual and adjustable; 44px is a comfort preference for expanded targets, not a mandatory visible height. Invisible targets must not steal neighbouring controls. Spacing derives from base text independently of control roominess and follows its own curve: linear at 1, increasingly curved toward 2, with stable endpoints so the largest gaps do not grow without bound. Depth generates families of shadows; it does not add motion amplitude. Fields and buttons with the same size setting use the same box height, while content can still grow when it needs more room.
|
|
85
|
+
The generated values follow rules. The medium control height is base text size times control roominess; small and large heights follow the size ratio. Touch does not inflate the visible size ladder. Hit-area guidance is contextual and adjustable; 44px is a comfort preference for expanded targets, not a mandatory visible height. Invisible targets must not steal neighbouring controls. Rhythm coordinates gaps and unitless line-height multipliers. Spacing fine-tunes gaps independently of text ratios. Spacing derives from base text independently of control roominess and follows its own curve: linear at 1, increasingly curved toward 2, with stable endpoints so the largest gaps do not grow without bound. Depth generates families of shadows; it does not add motion amplitude. Fields and buttons with the same size setting use the same box height, while content can still grow when it needs more room.
|
|
80
86
|
|
|
81
|
-
Choose a coordinated palette, then refine surface warmth, color intensity and palette relationship. Warmth runs from cool to warm paper and ink, with 0.5 neutral; intensity runs from quiet to vivid, with 0.5 retaining original seed intensity.
|
|
87
|
+
Choose a coordinated palette, then refine surface warmth, color intensity and palette relationship. Warmth runs from cool to warm paper and ink, with 0.5 neutral; intensity runs from quiet to vivid, with 0.5 retaining original seed intensity. Keep my colors preserves the base hues; Related colors and Contrasting colors tint quiet surfaces toward neighboring and opposite hues. These decisions regenerate paired light/dark colors through Oklab/OKLCH operations, gamut repair and readability checks. They do not transform existing CSS colors live. Four Base colors remain visible for precise edits; the light/dark range previews and resolved values explain adjustments.
|
|
82
88
|
|
|
83
89
|
The customizer uses Starting point, Palette and Material as its controls sidebar, with documentation navigation left out of this workspace. Detailed type, size and motion controls, example selection and exports open when needed.
|
|
84
90
|
|
|
85
|
-
The main customizer offers Material and Palette presets. **Refine material & light** opens a focused view with a movable light source, real component samples and bounded surface controls. **Refine palette** opens the coordinated light/dark ranges and their four
|
|
91
|
+
The main customizer offers Material and Palette presets. **Refine material & light** opens a focused view with a movable light source, real component samples and bounded surface controls. **Refine palette** opens the coordinated light/dark ranges and their four Base colors. Both views edit the same theme as the main customizer. Returning to the overview, navigating to a component, or reloading keeps the result.
|
|
86
92
|
|
|
87
93
|
A refined preset keeps its name with “customized” beside it. **Restore material preset** resets only material and light; **Restore palette preset** resets only the palette. These family choices are recorded in the recipe's optional `presets` mapping. The `values` mapping remains the complete source of the generated theme; a preset is a named combination of those values.
|
|
88
94
|
|
|
@@ -92,9 +98,14 @@ Lengths retain their CSS units, such as `rem`; times retain `ms` or `s`. The dow
|
|
|
92
98
|
|
|
93
99
|
Undo and Redo move through accepted recipe changes. There is no page-entry comparison state: reopening the customizer does not create a hidden before/after reference. **Explore nearby styles** previews Warmer, Quieter, More expressive or More compact before you apply it. Palette, Material and Type & spacing locks preserve those families during variations. Cancel preview returns to the current recipe.
|
|
94
100
|
|
|
95
|
-
Changes apply throughout the documentation and remain in this browser across navigation and reload until reset. Repository files change only when you save locally. Starting points update the shell and all selected cards. Reset
|
|
101
|
+
Changes apply throughout the documentation and remain in this browser across navigation and reload until reset. Repository files change only when you save locally. Starting points update the shell and all selected cards. Reset restores the selected starting theme’s values and remains undoable. Removing the header’s Custom theme chip instead clears the browser override and restores the repository baseline. Invalid input keeps the last valid preview and explains which decision needs attention.
|
|
102
|
+
|
|
103
|
+
Text offers body, display, heading, label, caption, eyebrow and code roles. Choose a heading's document level with `as` independently from its visual role. Button and IconButton keep appearance and tone independent, with four optional shortcuts: primary (solid accent), standard (solid neutral), quiet (ghost neutral) and destructive (solid danger). A named preset takes precedence over the separate choices; `preset="none"` uses the separate choices. Both default to neutral; choose `tone="accent"` or `preset="primary"` explicitly for emphasis.
|
|
96
104
|
|
|
97
|
-
|
|
105
|
+
**Font** sets body text and controls. Headings follow it while **Heading font** is
|
|
106
|
+
**Same as main font**; choose a second face there for headings and display text.
|
|
107
|
+
Google selections preview real faces and include their import in downloaded or
|
|
108
|
+
locally saved CSS. System font uses the operating system and needs no download.
|
|
98
109
|
|
|
99
110
|
## Theme decisions and public properties
|
|
100
111
|
|
|
@@ -102,10 +113,10 @@ The [public token reference](https://github.com/threadlabs-studio/looma/blob/mai
|
|
|
102
113
|
|
|
103
114
|
| Family | Recipe decisions → CSS properties |
|
|
104
115
|
| --- | --- |
|
|
105
|
-
|
|
|
116
|
+
| Base colors | `action` → `--ui-accent`; `canvas` → `--ui-surface`; `surface` → `--ui-surface-raised`; `text` → `--ui-text` |
|
|
106
117
|
| Palette generation (recipe only) | `warmth`, `color-intensity`, `palette-relationship`; compiled into resolved color roles, with no matching CSS custom properties |
|
|
107
118
|
| Type | `body-font` → `--ui-font-sans`; `display-font` → `--ui-font-display`; `text-size` → `--ui-font-size`; `text-weight` → `--ui-font-medium` |
|
|
108
|
-
|
|
|
119
|
+
| Rhythm & spacing | `rhythm` → `--ui-rhythm`; `control-roominess` → `--ui-control-roominess`; `spacing` → `--ui-spacing`; `scale-contrast` → `--ui-scale-ratio`; `space-curve` → `--ui-space-curve`; `corner-roundness` → `--ui-radius-md`; `line-weight` → `--ui-border-width` |
|
|
109
120
|
| Depth and transmission | `outer-depth` → `--ui-outer-depth`; `inner-depth` → `--ui-inner-depth`; `glassiness` → `--ui-glassiness`; `surface-separation` → `--ui-surface-separation`; `translucency` → `--ui-overlay-translucency` |
|
|
110
121
|
| Finish and illumination | `finish` → `--ui-finish`; `edge-light` → `--ui-edge-light`; `glow` → `--ui-glow`; `light-x` → `--ui-light-x`; `light-y` → `--ui-light-y`; `light-spread` → `--ui-light-spread`; `light-strength` → `--ui-light-strength` |
|
|
111
122
|
| Motion | `response-time` → `--ui-motion-fast`; `response-curve` → `--ui-motion-ease` |
|
|
@@ -140,7 +151,7 @@ To add a sample to the preview, search **Choose a component example**, select a
|
|
|
140
151
|
|
|
141
152
|
## Use light, dark, or both
|
|
142
153
|
|
|
143
|
-
Every generated theme includes a coordinated light/dark pair. The type, geometry and motion decisions stay shared. Both palettes derive readable text, outlines, focus and action states from the same identity; the generator may adjust requested
|
|
154
|
+
Every generated theme includes a coordinated light/dark pair. The type, geometry and motion decisions stay shared. Both palettes derive readable text, outlines, focus and action states from the same identity; the generator may adjust requested base colors to maintain contrast.
|
|
144
155
|
|
|
145
156
|
Load the generated CSS after Looma's tokens and palette. Choose how it runs:
|
|
146
157
|
|
|
@@ -237,3 +248,5 @@ Use the `@threadlabs/looma/docs` entrypoint for programmatic discovery, catalog
|
|
|
237
248
|
The local editor writes only the configured recipe and CSS inside the project. It rejects symlink paths, generated or dependency directories, cross-origin save requests and stale file revisions. A competing edit leaves your unsaved preview in place; reload and reconcile it before saving again. Examples run in isolated frames and receive theme CSS, never the local editing capability.
|
|
238
249
|
|
|
239
250
|
The writer stages complete files, serializes saves with a project lock, and rolls back the recipe if replacing the CSS fails. If a process stops during a save or build, close the old editor before removing its `.looma/theme-write.lock` or `.looma/docs-build.lock`; restart and save the loaded recipe to regenerate a consistent pair. Change the server base, output directory or theme-file paths by restarting `dev`.
|
|
251
|
+
|
|
252
|
+
Preset choices use the styled, searchable dropdown already used for fonts and component examples. Palette choices include four color swatches for the accent, neutral fill, canvas and text; the selected field previews the current theme. An inherited default keeps muted text while its options remain readable.
|
package/docs/catalog.json
CHANGED
|
@@ -365,6 +365,11 @@
|
|
|
365
365
|
"package": "@threadlabs/looma",
|
|
366
366
|
"resource": "@threadlabs/looma/components/ui-sidebar/ui-sidebar.html"
|
|
367
367
|
},
|
|
368
|
+
{
|
|
369
|
+
"tag": "ui-skeleton",
|
|
370
|
+
"package": "@threadlabs/looma",
|
|
371
|
+
"resource": "@threadlabs/looma/components/ui-skeleton/ui-skeleton.html"
|
|
372
|
+
},
|
|
368
373
|
{
|
|
369
374
|
"tag": "ui-slider",
|
|
370
375
|
"package": "@threadlabs/looma",
|
|
@@ -453,7 +458,7 @@
|
|
|
453
458
|
],
|
|
454
459
|
"schemaVersion": 1,
|
|
455
460
|
"package": "@threadlabs/looma",
|
|
456
|
-
"version": "0.
|
|
461
|
+
"version": "0.38.0",
|
|
457
462
|
"groups": [
|
|
458
463
|
{
|
|
459
464
|
"id": "layout",
|
|
@@ -1980,7 +1985,7 @@
|
|
|
1980
1985
|
{
|
|
1981
1986
|
"name": "--ui-button-ghost-active-surface",
|
|
1982
1987
|
"fallbacks": [
|
|
1983
|
-
"
|
|
1988
|
+
"oklch(from var(--_tone) l c h / 18%)"
|
|
1984
1989
|
]
|
|
1985
1990
|
},
|
|
1986
1991
|
{
|
|
@@ -2002,6 +2007,7 @@
|
|
|
2002
2007
|
],
|
|
2003
2008
|
"fallbacks": [
|
|
2004
2009
|
"var(--ui-border-strong)",
|
|
2010
|
+
"var(--ui-control-border-hover, var(--ui-control-border))",
|
|
2005
2011
|
"var(--ui-control-border-hover, var(--ui-text-secondary))"
|
|
2006
2012
|
]
|
|
2007
2013
|
},
|
|
@@ -2060,6 +2066,7 @@
|
|
|
2060
2066
|
"fallbacks": [
|
|
2061
2067
|
"oklch(from var(--_tone) l c h / 5%)",
|
|
2062
2068
|
"var(--ui-neutral-surface)",
|
|
2069
|
+
"transparent",
|
|
2063
2070
|
"var(--ui-control-surface, var(--ui-surface-elevated))"
|
|
2064
2071
|
]
|
|
2065
2072
|
},
|
|
@@ -2153,6 +2160,7 @@
|
|
|
2153
2160
|
{
|
|
2154
2161
|
"name": "--ui-control-border-hover",
|
|
2155
2162
|
"fallbacks": [
|
|
2163
|
+
"var(--ui-control-border)",
|
|
2156
2164
|
"var(--ui-text-secondary)"
|
|
2157
2165
|
]
|
|
2158
2166
|
},
|
|
@@ -2360,6 +2368,15 @@
|
|
|
2360
2368
|
{
|
|
2361
2369
|
"name": "--ui-radius-sm"
|
|
2362
2370
|
},
|
|
2371
|
+
{
|
|
2372
|
+
"name": "--ui-selection-border"
|
|
2373
|
+
},
|
|
2374
|
+
{
|
|
2375
|
+
"name": "--ui-selection-surface"
|
|
2376
|
+
},
|
|
2377
|
+
{
|
|
2378
|
+
"name": "--ui-selection-text"
|
|
2379
|
+
},
|
|
2363
2380
|
{
|
|
2364
2381
|
"name": "--ui-shadow-sm"
|
|
2365
2382
|
},
|
|
@@ -2574,7 +2591,7 @@
|
|
|
2574
2591
|
"property": "tone",
|
|
2575
2592
|
"description": "Which colour the button speaks in. It applies to every variant, so an outline, a ghost, and a solid in the same tone are the same action at three volumes: tone=\"danger\" variant=\"outline\" is a destructive secondary action. neutral is the quiet one, for a button that should not claim a colour. The field variant always uses neutral field colors.",
|
|
2576
2593
|
"type": "keyword",
|
|
2577
|
-
"default": "
|
|
2594
|
+
"default": "neutral",
|
|
2578
2595
|
"options": [
|
|
2579
2596
|
"accent",
|
|
2580
2597
|
"neutral",
|
|
@@ -2718,7 +2735,7 @@
|
|
|
2718
2735
|
"name": "tone",
|
|
2719
2736
|
"description": "Which colour the button speaks in. It applies to every variant, so an outline, a ghost, and a solid in the same tone are the same action at three volumes: tone=\"danger\" variant=\"outline\" is a destructive secondary action. neutral is the quiet one, for a button that should not claim a colour. The field variant always uses neutral field colors.",
|
|
2720
2737
|
"type": "\"accent\" | \"neutral\" | \"danger\" | \"success\" | \"warning\" | \"info\"",
|
|
2721
|
-
"default": "
|
|
2738
|
+
"default": "neutral",
|
|
2722
2739
|
"options": [
|
|
2723
2740
|
"accent",
|
|
2724
2741
|
"neutral",
|
|
@@ -2798,7 +2815,7 @@
|
|
|
2798
2815
|
"name": "02-variant",
|
|
2799
2816
|
"title": "variant",
|
|
2800
2817
|
"description": "Appearance sets emphasis independently from tone: solid neutral is a standard action, and danger can be an outline. Named presets combine those shared choices.",
|
|
2801
|
-
"markup": "<ui-cluster gap=\"s\">\n <ui-button variant=\"solid\">Solid</ui-button>\n <ui-button variant=\"outline\">Outline</ui-button>\n <ui-button variant=\"ghost\">Ghost</ui-button>\n <ui-button variant=\"danger\">Danger</ui-button>\n <ui-button variant=\"solid\" tone=\"neutral\">Solid neutral</ui-button>\n <ui-button variant=\"outline\" tone=\"danger\">Danger outline</ui-button>\n <ui-button preset=\"primary\">Primary</ui-button>\n <ui-button preset=\"standard\">Standard</ui-button>\n <ui-button preset=\"quiet\">Quiet</ui-button>\n <ui-button preset=\"destructive\">Destructive</ui-button>\n</ui-cluster>",
|
|
2818
|
+
"markup": "<ui-cluster gap=\"s\">\n <ui-button variant=\"solid\" tone=\"accent\">Solid</ui-button>\n <ui-button variant=\"outline\" tone=\"accent\">Outline</ui-button>\n <ui-button variant=\"ghost\" tone=\"accent\">Ghost</ui-button>\n <ui-button variant=\"danger\">Danger</ui-button>\n <ui-button variant=\"solid\" tone=\"neutral\">Solid neutral</ui-button>\n <ui-button variant=\"outline\" tone=\"danger\">Danger outline</ui-button>\n <ui-button preset=\"primary\">Primary</ui-button>\n <ui-button preset=\"standard\">Standard</ui-button>\n <ui-button preset=\"quiet\">Quiet</ui-button>\n <ui-button preset=\"destructive\">Destructive</ui-button>\n</ui-cluster>",
|
|
2802
2819
|
"resizable": false,
|
|
2803
2820
|
"bindings": "",
|
|
2804
2821
|
"frameworks": {}
|
|
@@ -4203,9 +4220,9 @@
|
|
|
4203
4220
|
"name": "99-theme-sampler",
|
|
4204
4221
|
"title": "Theme sampler",
|
|
4205
4222
|
"description": "A compact collection of real controls and a surface for judging a shared theme together.",
|
|
4206
|
-
"markup": "<ui-card treatment=\"expressive\" padding=\"sm\"><ui-stack gap=\"
|
|
4223
|
+
"markup": "<ui-card treatment=\"expressive\" padding=\"sm\"><ui-stack gap=\"s\">\n <ui-cluster gap=\"xs\" justify=\"between\"><ui-text variant=\"eyebrow\">Fellowship office</ui-text><ui-badge tone=\"success\">Ready</ui-badge></ui-cluster>\n <ui-text variant=\"heading\" as=\"h3\">Second breakfast, sorted.</ui-text>\n <ui-text>Frodo plans. Sam follows through.</ui-text>\n <ui-text variant=\"caption\">Briefing at nine · Bring the maps.</ui-text>\n <ui-cluster gap=\"s\">\n <ui-button size=\"sm\" variant=\"solid\" tone=\"accent\">Solid accent</ui-button>\n <ui-button size=\"sm\" variant=\"outline\" tone=\"accent\">Outline accent</ui-button>\n <ui-button size=\"sm\" variant=\"solid\" tone=\"neutral\">Solid neutral</ui-button>\n <ui-button size=\"sm\" variant=\"outline\" tone=\"neutral\">Outline neutral</ui-button>\n <ui-icon-button size=\"sm\" variant=\"outline\" tone=\"neutral\" match-button label=\"Acknowledge memo\"><ui-icon name=\"circle-check\"></ui-icon></ui-icon-button>\n <ui-button size=\"sm\" variant=\"ghost\" tone=\"neutral\">Ghost</ui-button>\n </ui-cluster>\n <ui-input-group><ui-icon slot=\"prefix\" name=\"search\"></ui-icon><ui-input\n size=\"sm\"\n aria-label=\"Search office\"\n placeholder=\"Search Fellowship office\"\n ></ui-input></ui-input-group>\n <ui-cluster gap=\"s\"><ui-checkbox size=\"sm\" checked>Notify Sam</ui-checkbox><ui-switch size=\"sm\" checked>Available</ui-switch><ui-badge tone=\"accent\"\n >Draft</ui-badge></ui-cluster>\n </ui-stack></ui-card>",
|
|
4207
4224
|
"resizable": false,
|
|
4208
|
-
"bindings": "
|
|
4225
|
+
"bindings": "",
|
|
4209
4226
|
"frameworks": {}
|
|
4210
4227
|
}
|
|
4211
4228
|
]
|
|
@@ -4581,7 +4598,7 @@
|
|
|
4581
4598
|
{
|
|
4582
4599
|
"name": "--ui-combobox-popup-surface",
|
|
4583
4600
|
"fallbacks": [
|
|
4584
|
-
"var(--ui-
|
|
4601
|
+
"var(--ui-material-content, var(--ui-surface-elevated))"
|
|
4585
4602
|
]
|
|
4586
4603
|
},
|
|
4587
4604
|
{
|
|
@@ -4715,6 +4732,12 @@
|
|
|
4715
4732
|
{
|
|
4716
4733
|
"name": "--ui-line-height-tight"
|
|
4717
4734
|
},
|
|
4735
|
+
{
|
|
4736
|
+
"name": "--ui-material-content",
|
|
4737
|
+
"fallbacks": [
|
|
4738
|
+
"var(--ui-surface-elevated)"
|
|
4739
|
+
]
|
|
4740
|
+
},
|
|
4718
4741
|
{
|
|
4719
4742
|
"name": "--ui-motion-ease"
|
|
4720
4743
|
},
|
|
@@ -4739,12 +4762,6 @@
|
|
|
4739
4762
|
"var(--ui-elevation-overlay, var(--ui-shadow-lg))"
|
|
4740
4763
|
]
|
|
4741
4764
|
},
|
|
4742
|
-
{
|
|
4743
|
-
"name": "--ui-overlay-surface",
|
|
4744
|
-
"fallbacks": [
|
|
4745
|
-
"var(--ui-surface-elevated)"
|
|
4746
|
-
]
|
|
4747
|
-
},
|
|
4748
4765
|
{
|
|
4749
4766
|
"name": "--ui-radius-md"
|
|
4750
4767
|
},
|
|
@@ -4969,6 +4986,13 @@
|
|
|
4969
4986
|
"type": "boolean",
|
|
4970
4987
|
"default": false
|
|
4971
4988
|
},
|
|
4989
|
+
{
|
|
4990
|
+
"name": "muted",
|
|
4991
|
+
"property": "muted",
|
|
4992
|
+
"description": "Shows the selected field value with supporting-text emphasis, for an inherited or default choice. Suggestions keep normal emphasis and the field stays interactive.",
|
|
4993
|
+
"type": "boolean",
|
|
4994
|
+
"default": false
|
|
4995
|
+
},
|
|
4972
4996
|
{
|
|
4973
4997
|
"name": "name",
|
|
4974
4998
|
"property": "name",
|
|
@@ -4979,7 +5003,7 @@
|
|
|
4979
5003
|
{
|
|
4980
5004
|
"name": "open-on-focus",
|
|
4981
5005
|
"property": "openOnFocus",
|
|
4982
|
-
"description": "Opens suggestions when the input receives focus
|
|
5006
|
+
"description": "Opens suggestions when the input receives focus or is clicked. A committed selection shows all choices until typing filters them; an explicitly supplied query keeps its filtering.",
|
|
4983
5007
|
"type": "boolean",
|
|
4984
5008
|
"default": false
|
|
4985
5009
|
},
|
|
@@ -5210,6 +5234,12 @@
|
|
|
5210
5234
|
"type": "boolean",
|
|
5211
5235
|
"default": false
|
|
5212
5236
|
},
|
|
5237
|
+
{
|
|
5238
|
+
"name": "muted",
|
|
5239
|
+
"description": "Shows the selected field value with supporting-text emphasis, for an inherited or default choice. Suggestions keep normal emphasis and the field stays interactive.",
|
|
5240
|
+
"type": "boolean",
|
|
5241
|
+
"default": false
|
|
5242
|
+
},
|
|
5213
5243
|
{
|
|
5214
5244
|
"name": "name",
|
|
5215
5245
|
"description": "The form field name the combobox submits its value under, never the label shown in the field. Single mode sends one entry: the selected option's value, the typed text when allowFreeText is set and no option is selected, or an empty string. Multiple mode sends one entry per chosen item's value, and nothing when none is chosen. A disabled combobox sends nothing.",
|
|
@@ -5218,7 +5248,7 @@
|
|
|
5218
5248
|
},
|
|
5219
5249
|
{
|
|
5220
5250
|
"name": "openOnFocus",
|
|
5221
|
-
"description": "Opens suggestions when the input receives focus
|
|
5251
|
+
"description": "Opens suggestions when the input receives focus or is clicked. A committed selection shows all choices until typing filters them; an explicitly supplied query keeps its filtering.",
|
|
5222
5252
|
"type": "boolean",
|
|
5223
5253
|
"default": false
|
|
5224
5254
|
},
|
|
@@ -12569,6 +12599,7 @@
|
|
|
12569
12599
|
{
|
|
12570
12600
|
"name": "--ui-icon-button-active-surface",
|
|
12571
12601
|
"fallbacks": [
|
|
12602
|
+
"var(--ui-neutral-active)",
|
|
12572
12603
|
"color-mix(in srgb, currentColor 16%, transparent)",
|
|
12573
12604
|
"color-mix(in srgb, currentColor 12%, var(--ui-surface-default))"
|
|
12574
12605
|
]
|
|
@@ -12600,7 +12631,8 @@
|
|
|
12600
12631
|
{
|
|
12601
12632
|
"name": "--ui-icon-button-hover-surface",
|
|
12602
12633
|
"fallbacks": [
|
|
12603
|
-
"color-mix(in srgb, currentColor 8%, transparent)"
|
|
12634
|
+
"color-mix(in srgb, currentColor 8%, transparent)",
|
|
12635
|
+
"var(--ui-neutral-hover)"
|
|
12604
12636
|
]
|
|
12605
12637
|
},
|
|
12606
12638
|
{
|
|
@@ -12864,6 +12896,9 @@
|
|
|
12864
12896
|
"var(--ui-motion-fast)"
|
|
12865
12897
|
]
|
|
12866
12898
|
},
|
|
12899
|
+
{
|
|
12900
|
+
"name": "--ui-neutral-active"
|
|
12901
|
+
},
|
|
12867
12902
|
{
|
|
12868
12903
|
"name": "--ui-neutral-glow",
|
|
12869
12904
|
"fallbacks": [
|
|
@@ -13064,11 +13099,10 @@
|
|
|
13064
13099
|
{
|
|
13065
13100
|
"name": "tone",
|
|
13066
13101
|
"property": "tone",
|
|
13067
|
-
"description": "Colour for every variant.
|
|
13102
|
+
"description": "Colour for every variant. The default neutral shares the quiet control family with fields and text buttons. Choose accent explicitly for a coloured action, or primary for solid accent. danger, success, warning and info share Button's intent colors. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
|
|
13068
13103
|
"type": "keyword",
|
|
13069
|
-
"default": "
|
|
13104
|
+
"default": "neutral",
|
|
13070
13105
|
"options": [
|
|
13071
|
-
"auto",
|
|
13072
13106
|
"accent",
|
|
13073
13107
|
"neutral",
|
|
13074
13108
|
"danger",
|
|
@@ -13080,7 +13114,7 @@
|
|
|
13080
13114
|
{
|
|
13081
13115
|
"name": "variant",
|
|
13082
13116
|
"property": "variant",
|
|
13083
|
-
"description": "Emphasis. ghost shows only the icon until it is hovered, for toolbars and dense rows; outline adds a border on the default surface; solid fills with
|
|
13117
|
+
"description": "Emphasis. ghost shows only the icon until it is hovered, for toolbars and dense rows; outline adds a border on the default surface; solid fills with its chosen tone.",
|
|
13084
13118
|
"type": "keyword",
|
|
13085
13119
|
"default": "ghost",
|
|
13086
13120
|
"options": [
|
|
@@ -13174,11 +13208,10 @@
|
|
|
13174
13208
|
},
|
|
13175
13209
|
{
|
|
13176
13210
|
"name": "tone",
|
|
13177
|
-
"description": "Colour for every variant.
|
|
13178
|
-
"type": "\"
|
|
13179
|
-
"default": "
|
|
13211
|
+
"description": "Colour for every variant. The default neutral shares the quiet control family with fields and text buttons. Choose accent explicitly for a coloured action, or primary for solid accent. danger, success, warning and info share Button's intent colors. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
|
|
13212
|
+
"type": "\"accent\" | \"neutral\" | \"danger\" | \"success\" | \"warning\" | \"info\"",
|
|
13213
|
+
"default": "neutral",
|
|
13180
13214
|
"options": [
|
|
13181
|
-
"auto",
|
|
13182
13215
|
"accent",
|
|
13183
13216
|
"neutral",
|
|
13184
13217
|
"danger",
|
|
@@ -13189,7 +13222,7 @@
|
|
|
13189
13222
|
},
|
|
13190
13223
|
{
|
|
13191
13224
|
"name": "variant",
|
|
13192
|
-
"description": "Emphasis. ghost shows only the icon until it is hovered, for toolbars and dense rows; outline adds a border on the default surface; solid fills with
|
|
13225
|
+
"description": "Emphasis. ghost shows only the icon until it is hovered, for toolbars and dense rows; outline adds a border on the default surface; solid fills with its chosen tone.",
|
|
13193
13226
|
"type": "\"ghost\" | \"outline\" | \"solid\"",
|
|
13194
13227
|
"default": "ghost",
|
|
13195
13228
|
"options": [
|
|
@@ -15925,7 +15958,7 @@
|
|
|
15925
15958
|
{
|
|
15926
15959
|
"name": "--ui-menu-item-hover-surface",
|
|
15927
15960
|
"fallbacks": [
|
|
15928
|
-
"var(--ui-
|
|
15961
|
+
"var(--ui-accent-subtle)"
|
|
15929
15962
|
]
|
|
15930
15963
|
},
|
|
15931
15964
|
{
|
|
@@ -15957,6 +15990,9 @@
|
|
|
15957
15990
|
{
|
|
15958
15991
|
"name": "--ui-accent"
|
|
15959
15992
|
},
|
|
15993
|
+
{
|
|
15994
|
+
"name": "--ui-accent-subtle"
|
|
15995
|
+
},
|
|
15960
15996
|
{
|
|
15961
15997
|
"name": "--ui-border-width"
|
|
15962
15998
|
},
|
|
@@ -16014,6 +16050,12 @@
|
|
|
16014
16050
|
{
|
|
16015
16051
|
"name": "--ui-selection-radius"
|
|
16016
16052
|
},
|
|
16053
|
+
{
|
|
16054
|
+
"name": "--ui-selection-surface"
|
|
16055
|
+
},
|
|
16056
|
+
{
|
|
16057
|
+
"name": "--ui-selection-text"
|
|
16058
|
+
},
|
|
16017
16059
|
{
|
|
16018
16060
|
"name": "--ui-space-2"
|
|
16019
16061
|
},
|
|
@@ -16023,9 +16065,6 @@
|
|
|
16023
16065
|
{
|
|
16024
16066
|
"name": "--ui-surface"
|
|
16025
16067
|
},
|
|
16026
|
-
{
|
|
16027
|
-
"name": "--ui-surface-subtle"
|
|
16028
|
-
},
|
|
16029
16068
|
{
|
|
16030
16069
|
"name": "--ui-text-primary"
|
|
16031
16070
|
},
|
|
@@ -19755,6 +19794,13 @@
|
|
|
19755
19794
|
"type": "boolean",
|
|
19756
19795
|
"default": false
|
|
19757
19796
|
},
|
|
19797
|
+
{
|
|
19798
|
+
"name": "muted",
|
|
19799
|
+
"property": "muted",
|
|
19800
|
+
"description": "Shows the selected value with supporting-text emphasis, for an inherited or default choice. The select remains interactive and its options retain normal emphasis.",
|
|
19801
|
+
"type": "boolean",
|
|
19802
|
+
"default": false
|
|
19803
|
+
},
|
|
19758
19804
|
{
|
|
19759
19805
|
"name": "required",
|
|
19760
19806
|
"property": "required",
|
|
@@ -19794,6 +19840,12 @@
|
|
|
19794
19840
|
"type": "boolean",
|
|
19795
19841
|
"default": false
|
|
19796
19842
|
},
|
|
19843
|
+
{
|
|
19844
|
+
"name": "muted",
|
|
19845
|
+
"description": "Shows the selected value with supporting-text emphasis, for an inherited or default choice. The select remains interactive and its options retain normal emphasis.",
|
|
19846
|
+
"type": "boolean",
|
|
19847
|
+
"default": false
|
|
19848
|
+
},
|
|
19797
19849
|
{
|
|
19798
19850
|
"name": "required",
|
|
19799
19851
|
"description": "Requires a non-empty option for form validation.",
|
|
@@ -20382,7 +20434,7 @@
|
|
|
20382
20434
|
"name": "01-app-shell",
|
|
20383
20435
|
"title": "App shell",
|
|
20384
20436
|
"description": "The sidebar is the panel only; the page places it beside its main content. The button toggles it with commandfor and command=\"--toggle\": docked it collapses, and below the breakpoint (40rem in this example) it opens as a drawer. Each open and close is one toggle event, whose detail gives open, mode, and trigger; as a drawer the popover's own toggle event, which has no detail, reaches the panel too.",
|
|
20385
|
-
"markup": "<ui-cluster wrap=\"nowrap\" align=\"stretch\" gap=\"m\">\n <ui-sidebar breakpoint=\"sm\" id=\"sidebar-nav\" aria-label=\"Workspace\">\n <ui-stack gap=\"s\" role=\"navigation\" aria-label=\"Office sections\">\n <ui-text variant=\"eyebrow\">Fellowship office</ui-text>\n <ui-nav-item href=\"#inbox\" current=\"true\">Inbox</ui-nav-item>\n <ui-nav-item href=\"#projects\">Quest planning</ui-nav-item>\n <ui-nav-item href=\"#settings\">Office settings</ui-nav-item>\n </ui-stack>\n </ui-sidebar>\n <ui-stack fill role=\"main\">\n <ui-icon-button commandfor=\"sidebar-nav\" command=\"--toggle\" label=\"Toggle sidebar\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n </ui-icon-button>\n <ui-card padding=\"sm\">Frodo and Sam’s team updates sit beside the office navigation.</ui-card>\n </ui-stack>\n</ui-cluster>",
|
|
20437
|
+
"markup": "<ui-cluster wrap=\"nowrap\" align=\"stretch\" gap=\"m\">\n <ui-sidebar breakpoint=\"sm\" id=\"sidebar-nav\" aria-label=\"Workspace\">\n <ui-stack gap=\"s\" role=\"navigation\" aria-label=\"Office sections\">\n <ui-text variant=\"eyebrow\">Fellowship office</ui-text>\n <ui-nav-item as=\"a\" href=\"#inbox\" current=\"true\">Inbox</ui-nav-item>\n <ui-nav-item as=\"a\" href=\"#projects\">Quest planning</ui-nav-item>\n <ui-nav-item as=\"a\" href=\"#settings\">Office settings</ui-nav-item>\n </ui-stack>\n </ui-sidebar>\n <ui-stack fill role=\"main\">\n <ui-icon-button commandfor=\"sidebar-nav\" command=\"--toggle\" label=\"Toggle sidebar\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n </ui-icon-button>\n <ui-card padding=\"sm\">Frodo and Sam’s team updates sit beside the office navigation.</ui-card>\n </ui-stack>\n</ui-cluster>",
|
|
20386
20438
|
"resizable": true,
|
|
20387
20439
|
"bindings": "",
|
|
20388
20440
|
"frameworks": {}
|
|
@@ -20399,6 +20451,169 @@
|
|
|
20399
20451
|
}
|
|
20400
20452
|
]
|
|
20401
20453
|
},
|
|
20454
|
+
{
|
|
20455
|
+
"tag": "ui-skeleton",
|
|
20456
|
+
"package": "@threadlabs/looma",
|
|
20457
|
+
"root": "span",
|
|
20458
|
+
"description": "Reserve the shape of incoming content without announcing each placeholder. Text follows the surrounding line metrics; circles and rectangles stand in for avatars and media. Use one status message and aria-busy on the loading region, then replace the placeholders with real content. Keep existing content visible during refresh when possible. Animation is optional and respects reduced motion.",
|
|
20459
|
+
"designTokens": {
|
|
20460
|
+
"sources": [
|
|
20461
|
+
"packages/looma/src/components/ui-skeleton/ui-skeleton.html"
|
|
20462
|
+
],
|
|
20463
|
+
"component": [
|
|
20464
|
+
{
|
|
20465
|
+
"name": "--ui-skeleton-height",
|
|
20466
|
+
"fallbacks": [
|
|
20467
|
+
"1lh",
|
|
20468
|
+
"auto",
|
|
20469
|
+
"8rem"
|
|
20470
|
+
]
|
|
20471
|
+
},
|
|
20472
|
+
{
|
|
20473
|
+
"name": "--ui-skeleton-width",
|
|
20474
|
+
"fallbacks": [
|
|
20475
|
+
"100%",
|
|
20476
|
+
"calc(2.5rem + 2 * var(--ui-border-width))"
|
|
20477
|
+
]
|
|
20478
|
+
}
|
|
20479
|
+
],
|
|
20480
|
+
"shared": [
|
|
20481
|
+
{
|
|
20482
|
+
"name": "--ui-border-width"
|
|
20483
|
+
},
|
|
20484
|
+
{
|
|
20485
|
+
"name": "--ui-radius-md"
|
|
20486
|
+
},
|
|
20487
|
+
{
|
|
20488
|
+
"name": "--ui-radius-round"
|
|
20489
|
+
},
|
|
20490
|
+
{
|
|
20491
|
+
"name": "--ui-radius-sm"
|
|
20492
|
+
},
|
|
20493
|
+
{
|
|
20494
|
+
"name": "--ui-text-primary"
|
|
20495
|
+
}
|
|
20496
|
+
]
|
|
20497
|
+
},
|
|
20498
|
+
"attributes": [
|
|
20499
|
+
{
|
|
20500
|
+
"name": "animated",
|
|
20501
|
+
"property": "animated",
|
|
20502
|
+
"description": "Gently pulses the placeholder. Off by default, and always still when the reader requests reduced motion.",
|
|
20503
|
+
"type": "boolean",
|
|
20504
|
+
"default": false
|
|
20505
|
+
},
|
|
20506
|
+
{
|
|
20507
|
+
"name": "height",
|
|
20508
|
+
"property": "height",
|
|
20509
|
+
"description": "Block size as a CSS length. Empty reserves one line for text, a square for circles, or 8rem for rectangles. Set only width to keep a circle square.",
|
|
20510
|
+
"type": "string",
|
|
20511
|
+
"default": ""
|
|
20512
|
+
},
|
|
20513
|
+
{
|
|
20514
|
+
"name": "shape",
|
|
20515
|
+
"property": "shape",
|
|
20516
|
+
"description": "The content's silhouette. text reserves one inherited line box with a shorter bar inside it; circle matches a medium Avatar; rectangle reserves a media area.",
|
|
20517
|
+
"type": "keyword",
|
|
20518
|
+
"default": "text",
|
|
20519
|
+
"options": [
|
|
20520
|
+
"text",
|
|
20521
|
+
"circle",
|
|
20522
|
+
"rectangle"
|
|
20523
|
+
]
|
|
20524
|
+
},
|
|
20525
|
+
{
|
|
20526
|
+
"name": "width",
|
|
20527
|
+
"property": "width",
|
|
20528
|
+
"description": "Inline size as a CSS length or percentage, constrained to the container. Empty fills the available width for text and rectangles, or matches a medium Avatar's outer size for circles.",
|
|
20529
|
+
"type": "string",
|
|
20530
|
+
"default": ""
|
|
20531
|
+
}
|
|
20532
|
+
],
|
|
20533
|
+
"properties": [
|
|
20534
|
+
{
|
|
20535
|
+
"name": "animated",
|
|
20536
|
+
"description": "Gently pulses the placeholder. Off by default, and always still when the reader requests reduced motion.",
|
|
20537
|
+
"type": "boolean",
|
|
20538
|
+
"default": false
|
|
20539
|
+
},
|
|
20540
|
+
{
|
|
20541
|
+
"name": "height",
|
|
20542
|
+
"description": "Block size as a CSS length. Empty reserves one line for text, a square for circles, or 8rem for rectangles. Set only width to keep a circle square.",
|
|
20543
|
+
"type": "string",
|
|
20544
|
+
"default": ""
|
|
20545
|
+
},
|
|
20546
|
+
{
|
|
20547
|
+
"name": "shape",
|
|
20548
|
+
"description": "The content's silhouette. text reserves one inherited line box with a shorter bar inside it; circle matches a medium Avatar; rectangle reserves a media area.",
|
|
20549
|
+
"type": "\"text\" | \"circle\" | \"rectangle\"",
|
|
20550
|
+
"default": "text",
|
|
20551
|
+
"options": [
|
|
20552
|
+
"text",
|
|
20553
|
+
"circle",
|
|
20554
|
+
"rectangle"
|
|
20555
|
+
]
|
|
20556
|
+
},
|
|
20557
|
+
{
|
|
20558
|
+
"name": "width",
|
|
20559
|
+
"description": "Inline size as a CSS length or percentage, constrained to the container. Empty fills the available width for text and rectangles, or matches a medium Avatar's outer size for circles.",
|
|
20560
|
+
"type": "string",
|
|
20561
|
+
"default": ""
|
|
20562
|
+
}
|
|
20563
|
+
],
|
|
20564
|
+
"events": [],
|
|
20565
|
+
"slots": [],
|
|
20566
|
+
"group": "display",
|
|
20567
|
+
"id": "@threadlabs/looma/ui-skeleton",
|
|
20568
|
+
"title": "Skeleton",
|
|
20569
|
+
"resource": "@threadlabs/looma/components/ui-skeleton/ui-skeleton.html",
|
|
20570
|
+
"targets": [
|
|
20571
|
+
"html-next",
|
|
20572
|
+
"vue"
|
|
20573
|
+
],
|
|
20574
|
+
"examples": [
|
|
20575
|
+
{
|
|
20576
|
+
"id": "@threadlabs/looma/ui-skeleton/01-text",
|
|
20577
|
+
"name": "01-text",
|
|
20578
|
+
"title": "Text lines",
|
|
20579
|
+
"description": "Each placeholder reserves a whole text line. Vary the widths to suggest the content without pretending to know its words.",
|
|
20580
|
+
"markup": "<ui-stack gap=\"none\">\n <ui-skeleton></ui-skeleton>\n <ui-skeleton width=\"85%\"></ui-skeleton>\n <ui-skeleton width=\"60%\"></ui-skeleton>\n</ui-stack>",
|
|
20581
|
+
"resizable": false,
|
|
20582
|
+
"bindings": "",
|
|
20583
|
+
"frameworks": {}
|
|
20584
|
+
},
|
|
20585
|
+
{
|
|
20586
|
+
"id": "@threadlabs/looma/ui-skeleton/02-shapes",
|
|
20587
|
+
"name": "02-shapes",
|
|
20588
|
+
"title": "Avatar and media shapes",
|
|
20589
|
+
"description": "The default circle matches a medium Avatar. Supply dimensions for a thumbnail or a larger media area; narrow containers constrain the width.",
|
|
20590
|
+
"markup": "<ui-stack gap=\"m\">\n <ui-cluster gap=\"m\">\n <ui-skeleton shape=\"circle\"></ui-skeleton>\n <ui-skeleton shape=\"circle\" width=\"1.75rem\"></ui-skeleton>\n <ui-skeleton shape=\"rectangle\" width=\"6rem\" height=\"2.5rem\"></ui-skeleton>\n </ui-cluster>\n <ui-skeleton shape=\"rectangle\"></ui-skeleton>\n</ui-stack>",
|
|
20591
|
+
"resizable": false,
|
|
20592
|
+
"bindings": "",
|
|
20593
|
+
"frameworks": {}
|
|
20594
|
+
},
|
|
20595
|
+
{
|
|
20596
|
+
"id": "@threadlabs/looma/ui-skeleton/03-loading-card",
|
|
20597
|
+
"name": "03-loading-card",
|
|
20598
|
+
"title": "Loading a profile",
|
|
20599
|
+
"description": "One status describes the work; the section stays busy until the application replaces its decorative placeholders. Compare the loaded card's avatar and text metrics.",
|
|
20600
|
+
"markup": "<ui-stack gap=\"m\">\n <ui-status-message kind=\"loading\">Loading a profile…</ui-status-message>\n <ui-grid>\n <ui-card as=\"section\" aria-label=\"Profile\" aria-busy=\"true\">\n <ui-cluster gap=\"s\">\n <ui-skeleton shape=\"circle\"></ui-skeleton>\n <ui-stack fill gap=\"none\">\n <ui-skeleton width=\"65%\"></ui-skeleton>\n <ui-skeleton width=\"45%\"></ui-skeleton>\n </ui-stack>\n </ui-cluster>\n <ui-stack gap=\"none\">\n <ui-skeleton></ui-skeleton>\n <ui-skeleton width=\"80%\"></ui-skeleton>\n </ui-stack>\n </ui-card>\n <ui-card as=\"section\" aria-label=\"Loaded profile\">\n <ui-cluster gap=\"s\">\n <ui-avatar name=\"Ada Lovelace\" decorative></ui-avatar>\n <ui-stack fill gap=\"none\">\n <ui-text weight=\"semibold\">Ada Lovelace</ui-text>\n <ui-text tone=\"secondary\">Mathematician</ui-text>\n </ui-stack>\n </ui-cluster>\n <ui-text>Notes on an analytical engine and the possibilities of computation.</ui-text>\n </ui-card>\n </ui-grid>\n</ui-stack>",
|
|
20601
|
+
"resizable": false,
|
|
20602
|
+
"bindings": "",
|
|
20603
|
+
"frameworks": {}
|
|
20604
|
+
},
|
|
20605
|
+
{
|
|
20606
|
+
"id": "@threadlabs/looma/ui-skeleton/04-animation",
|
|
20607
|
+
"name": "04-animation",
|
|
20608
|
+
"title": "Optional motion",
|
|
20609
|
+
"description": "Still by default. Opt in to a gentle pulse when it helps convey loading; reduced-motion preferences always keep it still.",
|
|
20610
|
+
"markup": "<ui-stack gap=\"s\">\n <ui-text tone=\"secondary\" size=\"sm\">Still</ui-text>\n <ui-skeleton width=\"75%\"></ui-skeleton>\n <ui-text tone=\"secondary\" size=\"sm\">Animated when motion is welcome</ui-text>\n <ui-skeleton animated width=\"75%\"></ui-skeleton>\n</ui-stack>",
|
|
20611
|
+
"resizable": false,
|
|
20612
|
+
"bindings": "",
|
|
20613
|
+
"frameworks": {}
|
|
20614
|
+
}
|
|
20615
|
+
]
|
|
20616
|
+
},
|
|
20402
20617
|
{
|
|
20403
20618
|
"tag": "ui-slider",
|
|
20404
20619
|
"package": "@threadlabs/looma",
|