@threadlabs/looma 0.37.6 → 0.39.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/EXPRESSIVE-MARKDOWN.md +2 -0
- package/README.md +1 -1
- 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/dist/index.js +1 -1
- package/docs/README.md +25 -12
- package/docs/catalog.json +78 -31
- package/docs/cli.mjs +1 -1
- package/docs/commands.mjs +2 -2
- package/docs/customizer-render.mjs +36 -20
- package/docs/customizer.js +76 -25
- package/docs/documentation.css +2 -0
- package/docs/index.d.ts +3 -3
- package/docs/local-server.mjs +1 -1
- package/docs/palette.mjs +3 -3
- package/docs/site.mjs +7 -7
- package/docs/theme-session.mjs +1 -0
- package/docs/theme.mjs +11 -10
- package/editor/expressmark.js +12 -4
- package/package.json +6 -6
- 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/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/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/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/components.css +126 -25
- package/vue/editor/index.js +2 -3
package/docs/README.md
CHANGED
|
@@ -12,12 +12,12 @@ 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
|
|
15
|
+
pnpm add -D 'markupress@>=0.10.0 <1' '@threadlabs/markupkit@>=0.2.0 <1' vite
|
|
16
16
|
pnpm exec looma-docs init --title "The Fellowship"
|
|
17
17
|
pnpm exec looma-docs dev
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
Use the tool versions accepted by Looma's optional peer dependencies. Markupress 0.
|
|
20
|
+
Use the tool versions accepted by Looma's optional peer dependencies. Markupress 0.10 and later compatible 0.x releases supply the current documentation theme, including one appearance button that cycles Automatic, Light and Dark. Regular component imports do not load the documentation server. Vue and Tiptap remain optional; install them when your own authored documentation mounts the Vue editor.
|
|
21
21
|
|
|
22
22
|
Initialization creates three project-owned files:
|
|
23
23
|
|
|
@@ -33,12 +33,18 @@ 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
|
|
39
45
|
```
|
|
40
46
|
|
|
41
|
-
`build` produces a static
|
|
47
|
+
`build` produces a static MarkupKit site in the configured output directory. `preview` serves that output without a repository writer. All commands accept `--root`; `dev` and `preview` also accept `--port`.
|
|
42
48
|
|
|
43
49
|
## Name your local design system
|
|
44
50
|
|
|
@@ -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
|
@@ -458,7 +458,7 @@
|
|
|
458
458
|
],
|
|
459
459
|
"schemaVersion": 1,
|
|
460
460
|
"package": "@threadlabs/looma",
|
|
461
|
-
"version": "0.
|
|
461
|
+
"version": "0.39.0",
|
|
462
462
|
"groups": [
|
|
463
463
|
{
|
|
464
464
|
"id": "layout",
|
|
@@ -1985,7 +1985,7 @@
|
|
|
1985
1985
|
{
|
|
1986
1986
|
"name": "--ui-button-ghost-active-surface",
|
|
1987
1987
|
"fallbacks": [
|
|
1988
|
-
"
|
|
1988
|
+
"oklch(from var(--_tone) l c h / 18%)"
|
|
1989
1989
|
]
|
|
1990
1990
|
},
|
|
1991
1991
|
{
|
|
@@ -2007,6 +2007,7 @@
|
|
|
2007
2007
|
],
|
|
2008
2008
|
"fallbacks": [
|
|
2009
2009
|
"var(--ui-border-strong)",
|
|
2010
|
+
"var(--ui-control-border-hover, var(--ui-control-border))",
|
|
2010
2011
|
"var(--ui-control-border-hover, var(--ui-text-secondary))"
|
|
2011
2012
|
]
|
|
2012
2013
|
},
|
|
@@ -2065,6 +2066,7 @@
|
|
|
2065
2066
|
"fallbacks": [
|
|
2066
2067
|
"oklch(from var(--_tone) l c h / 5%)",
|
|
2067
2068
|
"var(--ui-neutral-surface)",
|
|
2069
|
+
"transparent",
|
|
2068
2070
|
"var(--ui-control-surface, var(--ui-surface-elevated))"
|
|
2069
2071
|
]
|
|
2070
2072
|
},
|
|
@@ -2158,6 +2160,7 @@
|
|
|
2158
2160
|
{
|
|
2159
2161
|
"name": "--ui-control-border-hover",
|
|
2160
2162
|
"fallbacks": [
|
|
2163
|
+
"var(--ui-control-border)",
|
|
2161
2164
|
"var(--ui-text-secondary)"
|
|
2162
2165
|
]
|
|
2163
2166
|
},
|
|
@@ -2365,6 +2368,15 @@
|
|
|
2365
2368
|
{
|
|
2366
2369
|
"name": "--ui-radius-sm"
|
|
2367
2370
|
},
|
|
2371
|
+
{
|
|
2372
|
+
"name": "--ui-selection-border"
|
|
2373
|
+
},
|
|
2374
|
+
{
|
|
2375
|
+
"name": "--ui-selection-surface"
|
|
2376
|
+
},
|
|
2377
|
+
{
|
|
2378
|
+
"name": "--ui-selection-text"
|
|
2379
|
+
},
|
|
2368
2380
|
{
|
|
2369
2381
|
"name": "--ui-shadow-sm"
|
|
2370
2382
|
},
|
|
@@ -2579,7 +2591,7 @@
|
|
|
2579
2591
|
"property": "tone",
|
|
2580
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.",
|
|
2581
2593
|
"type": "keyword",
|
|
2582
|
-
"default": "
|
|
2594
|
+
"default": "neutral",
|
|
2583
2595
|
"options": [
|
|
2584
2596
|
"accent",
|
|
2585
2597
|
"neutral",
|
|
@@ -2723,7 +2735,7 @@
|
|
|
2723
2735
|
"name": "tone",
|
|
2724
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.",
|
|
2725
2737
|
"type": "\"accent\" | \"neutral\" | \"danger\" | \"success\" | \"warning\" | \"info\"",
|
|
2726
|
-
"default": "
|
|
2738
|
+
"default": "neutral",
|
|
2727
2739
|
"options": [
|
|
2728
2740
|
"accent",
|
|
2729
2741
|
"neutral",
|
|
@@ -2803,7 +2815,7 @@
|
|
|
2803
2815
|
"name": "02-variant",
|
|
2804
2816
|
"title": "variant",
|
|
2805
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.",
|
|
2806
|
-
"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>",
|
|
2807
2819
|
"resizable": false,
|
|
2808
2820
|
"bindings": "",
|
|
2809
2821
|
"frameworks": {}
|
|
@@ -4208,9 +4220,9 @@
|
|
|
4208
4220
|
"name": "99-theme-sampler",
|
|
4209
4221
|
"title": "Theme sampler",
|
|
4210
4222
|
"description": "A compact collection of real controls and a surface for judging a shared theme together.",
|
|
4211
|
-
"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>",
|
|
4212
4224
|
"resizable": false,
|
|
4213
|
-
"bindings": "
|
|
4225
|
+
"bindings": "",
|
|
4214
4226
|
"frameworks": {}
|
|
4215
4227
|
}
|
|
4216
4228
|
]
|
|
@@ -4586,7 +4598,7 @@
|
|
|
4586
4598
|
{
|
|
4587
4599
|
"name": "--ui-combobox-popup-surface",
|
|
4588
4600
|
"fallbacks": [
|
|
4589
|
-
"var(--ui-
|
|
4601
|
+
"var(--ui-material-content, var(--ui-surface-elevated))"
|
|
4590
4602
|
]
|
|
4591
4603
|
},
|
|
4592
4604
|
{
|
|
@@ -4720,6 +4732,12 @@
|
|
|
4720
4732
|
{
|
|
4721
4733
|
"name": "--ui-line-height-tight"
|
|
4722
4734
|
},
|
|
4735
|
+
{
|
|
4736
|
+
"name": "--ui-material-content",
|
|
4737
|
+
"fallbacks": [
|
|
4738
|
+
"var(--ui-surface-elevated)"
|
|
4739
|
+
]
|
|
4740
|
+
},
|
|
4723
4741
|
{
|
|
4724
4742
|
"name": "--ui-motion-ease"
|
|
4725
4743
|
},
|
|
@@ -4744,12 +4762,6 @@
|
|
|
4744
4762
|
"var(--ui-elevation-overlay, var(--ui-shadow-lg))"
|
|
4745
4763
|
]
|
|
4746
4764
|
},
|
|
4747
|
-
{
|
|
4748
|
-
"name": "--ui-overlay-surface",
|
|
4749
|
-
"fallbacks": [
|
|
4750
|
-
"var(--ui-surface-elevated)"
|
|
4751
|
-
]
|
|
4752
|
-
},
|
|
4753
4765
|
{
|
|
4754
4766
|
"name": "--ui-radius-md"
|
|
4755
4767
|
},
|
|
@@ -4974,6 +4986,13 @@
|
|
|
4974
4986
|
"type": "boolean",
|
|
4975
4987
|
"default": false
|
|
4976
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
|
+
},
|
|
4977
4996
|
{
|
|
4978
4997
|
"name": "name",
|
|
4979
4998
|
"property": "name",
|
|
@@ -4984,7 +5003,7 @@
|
|
|
4984
5003
|
{
|
|
4985
5004
|
"name": "open-on-focus",
|
|
4986
5005
|
"property": "openOnFocus",
|
|
4987
|
-
"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.",
|
|
4988
5007
|
"type": "boolean",
|
|
4989
5008
|
"default": false
|
|
4990
5009
|
},
|
|
@@ -5215,6 +5234,12 @@
|
|
|
5215
5234
|
"type": "boolean",
|
|
5216
5235
|
"default": false
|
|
5217
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
|
+
},
|
|
5218
5243
|
{
|
|
5219
5244
|
"name": "name",
|
|
5220
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.",
|
|
@@ -5223,7 +5248,7 @@
|
|
|
5223
5248
|
},
|
|
5224
5249
|
{
|
|
5225
5250
|
"name": "openOnFocus",
|
|
5226
|
-
"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.",
|
|
5227
5252
|
"type": "boolean",
|
|
5228
5253
|
"default": false
|
|
5229
5254
|
},
|
|
@@ -12574,6 +12599,7 @@
|
|
|
12574
12599
|
{
|
|
12575
12600
|
"name": "--ui-icon-button-active-surface",
|
|
12576
12601
|
"fallbacks": [
|
|
12602
|
+
"var(--ui-neutral-active)",
|
|
12577
12603
|
"color-mix(in srgb, currentColor 16%, transparent)",
|
|
12578
12604
|
"color-mix(in srgb, currentColor 12%, var(--ui-surface-default))"
|
|
12579
12605
|
]
|
|
@@ -12605,7 +12631,8 @@
|
|
|
12605
12631
|
{
|
|
12606
12632
|
"name": "--ui-icon-button-hover-surface",
|
|
12607
12633
|
"fallbacks": [
|
|
12608
|
-
"color-mix(in srgb, currentColor 8%, transparent)"
|
|
12634
|
+
"color-mix(in srgb, currentColor 8%, transparent)",
|
|
12635
|
+
"var(--ui-neutral-hover)"
|
|
12609
12636
|
]
|
|
12610
12637
|
},
|
|
12611
12638
|
{
|
|
@@ -12869,6 +12896,9 @@
|
|
|
12869
12896
|
"var(--ui-motion-fast)"
|
|
12870
12897
|
]
|
|
12871
12898
|
},
|
|
12899
|
+
{
|
|
12900
|
+
"name": "--ui-neutral-active"
|
|
12901
|
+
},
|
|
12872
12902
|
{
|
|
12873
12903
|
"name": "--ui-neutral-glow",
|
|
12874
12904
|
"fallbacks": [
|
|
@@ -13069,11 +13099,10 @@
|
|
|
13069
13099
|
{
|
|
13070
13100
|
"name": "tone",
|
|
13071
13101
|
"property": "tone",
|
|
13072
|
-
"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.",
|
|
13073
13103
|
"type": "keyword",
|
|
13074
|
-
"default": "
|
|
13104
|
+
"default": "neutral",
|
|
13075
13105
|
"options": [
|
|
13076
|
-
"auto",
|
|
13077
13106
|
"accent",
|
|
13078
13107
|
"neutral",
|
|
13079
13108
|
"danger",
|
|
@@ -13085,7 +13114,7 @@
|
|
|
13085
13114
|
{
|
|
13086
13115
|
"name": "variant",
|
|
13087
13116
|
"property": "variant",
|
|
13088
|
-
"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.",
|
|
13089
13118
|
"type": "keyword",
|
|
13090
13119
|
"default": "ghost",
|
|
13091
13120
|
"options": [
|
|
@@ -13179,11 +13208,10 @@
|
|
|
13179
13208
|
},
|
|
13180
13209
|
{
|
|
13181
13210
|
"name": "tone",
|
|
13182
|
-
"description": "Colour for every variant.
|
|
13183
|
-
"type": "\"
|
|
13184
|
-
"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",
|
|
13185
13214
|
"options": [
|
|
13186
|
-
"auto",
|
|
13187
13215
|
"accent",
|
|
13188
13216
|
"neutral",
|
|
13189
13217
|
"danger",
|
|
@@ -13194,7 +13222,7 @@
|
|
|
13194
13222
|
},
|
|
13195
13223
|
{
|
|
13196
13224
|
"name": "variant",
|
|
13197
|
-
"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.",
|
|
13198
13226
|
"type": "\"ghost\" | \"outline\" | \"solid\"",
|
|
13199
13227
|
"default": "ghost",
|
|
13200
13228
|
"options": [
|
|
@@ -15930,7 +15958,7 @@
|
|
|
15930
15958
|
{
|
|
15931
15959
|
"name": "--ui-menu-item-hover-surface",
|
|
15932
15960
|
"fallbacks": [
|
|
15933
|
-
"var(--ui-
|
|
15961
|
+
"var(--ui-accent-subtle)"
|
|
15934
15962
|
]
|
|
15935
15963
|
},
|
|
15936
15964
|
{
|
|
@@ -15962,6 +15990,9 @@
|
|
|
15962
15990
|
{
|
|
15963
15991
|
"name": "--ui-accent"
|
|
15964
15992
|
},
|
|
15993
|
+
{
|
|
15994
|
+
"name": "--ui-accent-subtle"
|
|
15995
|
+
},
|
|
15965
15996
|
{
|
|
15966
15997
|
"name": "--ui-border-width"
|
|
15967
15998
|
},
|
|
@@ -16019,6 +16050,12 @@
|
|
|
16019
16050
|
{
|
|
16020
16051
|
"name": "--ui-selection-radius"
|
|
16021
16052
|
},
|
|
16053
|
+
{
|
|
16054
|
+
"name": "--ui-selection-surface"
|
|
16055
|
+
},
|
|
16056
|
+
{
|
|
16057
|
+
"name": "--ui-selection-text"
|
|
16058
|
+
},
|
|
16022
16059
|
{
|
|
16023
16060
|
"name": "--ui-space-2"
|
|
16024
16061
|
},
|
|
@@ -16028,9 +16065,6 @@
|
|
|
16028
16065
|
{
|
|
16029
16066
|
"name": "--ui-surface"
|
|
16030
16067
|
},
|
|
16031
|
-
{
|
|
16032
|
-
"name": "--ui-surface-subtle"
|
|
16033
|
-
},
|
|
16034
16068
|
{
|
|
16035
16069
|
"name": "--ui-text-primary"
|
|
16036
16070
|
},
|
|
@@ -19760,6 +19794,13 @@
|
|
|
19760
19794
|
"type": "boolean",
|
|
19761
19795
|
"default": false
|
|
19762
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
|
+
},
|
|
19763
19804
|
{
|
|
19764
19805
|
"name": "required",
|
|
19765
19806
|
"property": "required",
|
|
@@ -19799,6 +19840,12 @@
|
|
|
19799
19840
|
"type": "boolean",
|
|
19800
19841
|
"default": false
|
|
19801
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
|
+
},
|
|
19802
19849
|
{
|
|
19803
19850
|
"name": "required",
|
|
19804
19851
|
"description": "Requires a non-empty option for form validation.",
|
|
@@ -20387,7 +20434,7 @@
|
|
|
20387
20434
|
"name": "01-app-shell",
|
|
20388
20435
|
"title": "App shell",
|
|
20389
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.",
|
|
20390
|
-
"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>",
|
|
20391
20438
|
"resizable": true,
|
|
20392
20439
|
"bindings": "",
|
|
20393
20440
|
"frameworks": {}
|
package/docs/cli.mjs
CHANGED
|
@@ -6,7 +6,7 @@ try {
|
|
|
6
6
|
const { values, positionals } = parseArgs({ allowPositionals: true, options: { root: { type: 'string' }, port: { type: 'string' }, title: { type: 'string' }, help: { type: 'boolean', short: 'h' } } });
|
|
7
7
|
const [command = 'help'] = positionals;
|
|
8
8
|
if (values.help || command === 'help') {
|
|
9
|
-
console.log('looma-docs init | dev | build | preview\n\n --root <project> Project directory\n --port <number> Local server port (default 3000)\n --title <name> Documentation title for init\n\nInstall the optional documentation peers: markupress, @
|
|
9
|
+
console.log('looma-docs init | dev | build | preview\n\n --root <project> Project directory\n --port <number> Local server port (default 3000)\n --title <name> Documentation title for init\n\nInstall the optional documentation peers: markupress, @threadlabs/markupkit and vite.');
|
|
10
10
|
} else {
|
|
11
11
|
const options = { ...(values.root ? { root: values.root } : {}), ...(values.title ? { title: values.title } : {}) };
|
|
12
12
|
if (values.port) { const port = Number(values.port); if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error('Port must be an integer from 0 to 65535.'); options.port = port; }
|
package/docs/commands.mjs
CHANGED
|
@@ -47,11 +47,11 @@ export async function buildProjectDocumentation({ root = process.cwd(), config,
|
|
|
47
47
|
}
|
|
48
48
|
export async function previewProjectDocumentation({ root = process.cwd(), config, port = 3000 } = {}) {
|
|
49
49
|
if (!config) ({ root, config } = await readConfiguration(root));
|
|
50
|
-
const { previewApplication } = await tool('@
|
|
50
|
+
const { previewApplication } = await tool('@threadlabs/markupkit', root);
|
|
51
51
|
return previewApplication({ root, outDir: config.outDir ?? '.looma/site', base: config.base ?? '/', host: '127.0.0.1', port });
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
54
|
+
/** MarkupKit serves the build; this local-only gateway adds the constrained repository writer. */
|
|
55
55
|
export async function devProjectDocumentation({ root = process.cwd(), config, catalog, port = 3000, onError = console.error } = {}) {
|
|
56
56
|
const configured = Boolean(config);
|
|
57
57
|
if (!config) ({ root, config } = await readConfiguration(root));
|