@threadlabs/looma 0.41.0 → 0.41.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/docs/catalog.json CHANGED
@@ -463,7 +463,7 @@
463
463
  ],
464
464
  "schemaVersion": 1,
465
465
  "package": "@threadlabs/looma",
466
- "version": "0.41.0",
466
+ "version": "0.41.2",
467
467
  "groups": [
468
468
  {
469
469
  "id": "layout",
@@ -3004,7 +3004,7 @@
3004
3004
  {
3005
3005
  "name": "--ui-callout-surface",
3006
3006
  "declarations": [
3007
- "oklch(from var(--_callout-border) l c h / 10%)",
3007
+ "light-dark( oklch(from var(--_callout-border) 96% min(c, calc(0.02 + 0.03 * max(0, cos(calc((h - 140) * 1deg))))) h), oklch(from var(--_callout-border) 25% min(c, 0.035) h) )",
3008
3008
  "var(--ui-surface-muted)"
3009
3009
  ]
3010
3010
  },
@@ -20449,6 +20449,9 @@
20449
20449
  {
20450
20450
  "name": "--ui-border-width"
20451
20451
  },
20452
+ {
20453
+ "name": "--ui-control-min-block-size"
20454
+ },
20452
20455
  {
20453
20456
  "name": "--ui-focus-ring"
20454
20457
  },
@@ -20575,8 +20578,8 @@
20575
20578
  "id": "@threadlabs/looma/ui-site-header/01-default",
20576
20579
  "name": "01-default",
20577
20580
  "title": "Site navigation",
20578
- "description": "A full-width header keeps its logo visible, places desktop navigation beside it, and puts search and account controls at the trailing edge. On mobile, the navigation moves into the menu.",
20579
- "markup": "<ui-site-header>\n <a slot=\"brand\" href=\"#home\" aria-label=\"Folio home\"><ui-icon name=\"compass\"></ui-icon>Folio</a>\n <a slot=\"navigation\" href=\"#guide\" aria-current=\"page\">Guide</a>\n <a slot=\"navigation\" href=\"#components\">Components</a>\n <a slot=\"navigation\" href=\"#journal\">Journal</a>\n <ui-icon-button id=\"site-header-menu-trigger\" slot=\"menu\" size=\"sm\" label=\"Open navigation\"><ui-icon name=\"panel-left\"></ui-icon></ui-icon-button>\n <ui-cluster slot=\"actions\" gap=\"xs\">\n <ui-icon-button id=\"site-header-search-trigger\" size=\"sm\" label=\"Search pages\"><ui-icon name=\"search\"></ui-icon></ui-icon-button>\n <ui-icon-button id=\"site-header-account-trigger\" size=\"sm\" label=\"Account\"><ui-icon name=\"user-round\"></ui-icon></ui-icon-button>\n </ui-cluster>\n</ui-site-header>\n<ui-popover for=\"site-header-menu-trigger\"><nav aria-label=\"Compact navigation\">\n <ui-stack gap=\"s\"><a href=\"#guide\" aria-current=\"page\">Guide</a><a href=\"#components\">Components</a><a href=\"#journal\">Journal</a></ui-stack>\n </nav></ui-popover>\n<ui-popover for=\"site-header-search-trigger\"><ui-form-field>\n <label slot=\"label\" for=\"site-header-search\">Search pages</label><ui-input id=\"site-header-search\" type=\"search\" placeholder=\"Find a page\"></ui-input>\n </ui-form-field></ui-popover>\n<ui-popover for=\"site-header-account-trigger\"><nav aria-label=\"Account\">\n <ui-stack gap=\"s\"><a href=\"#profile\">Your profile</a><a href=\"#settings\">Settings</a></ui-stack>\n </nav></ui-popover>",
20581
+ "description": "A full-width header keeps its logo visible, places desktop navigation beside it, and puts search and account controls at the trailing edge. On mobile, the navigation moves into the menu. Pass actions individually so the header can reserve space for their adjustable hit areas.",
20582
+ "markup": "<ui-site-header>\n <a slot=\"brand\" href=\"#home\" aria-label=\"Folio home\"><ui-icon name=\"compass\"></ui-icon>Folio</a>\n <a slot=\"navigation\" href=\"#guide\" aria-current=\"page\">Guide</a>\n <a slot=\"navigation\" href=\"#components\">Components</a>\n <a slot=\"navigation\" href=\"#journal\">Journal</a>\n <ui-icon-button id=\"site-header-menu-trigger\" slot=\"menu\" size=\"sm\" label=\"Open navigation\"><ui-icon name=\"panel-left\"></ui-icon></ui-icon-button>\n <ui-icon-button slot=\"actions\" id=\"site-header-search-trigger\" size=\"sm\" label=\"Search pages\"><ui-icon name=\"search\"></ui-icon></ui-icon-button>\n <ui-icon-button slot=\"actions\" id=\"site-header-account-trigger\" size=\"sm\" label=\"Account\"><ui-icon name=\"user-round\"></ui-icon></ui-icon-button>\n</ui-site-header>\n<ui-popover for=\"site-header-menu-trigger\"><nav aria-label=\"Compact navigation\">\n <ui-stack gap=\"s\"><a href=\"#guide\" aria-current=\"page\">Guide</a><a href=\"#components\">Components</a><a href=\"#journal\">Journal</a></ui-stack>\n </nav></ui-popover>\n<ui-popover for=\"site-header-search-trigger\"><ui-form-field>\n <label slot=\"label\" for=\"site-header-search\">Search pages</label><ui-input id=\"site-header-search\" type=\"search\" placeholder=\"Find a page\"></ui-input>\n </ui-form-field></ui-popover>\n<ui-popover for=\"site-header-account-trigger\"><nav aria-label=\"Account\">\n <ui-stack gap=\"s\"><a href=\"#profile\">Your profile</a><a href=\"#settings\">Settings</a></ui-stack>\n </nav></ui-popover>",
20580
20583
  "resizable": false,
20581
20584
  "bindings": "",
20582
20585
  "frameworks": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.41.0",
3
+ "version": "0.41.2",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -59,7 +59,11 @@
59
59
  --_ui-callout-icon: var(--ui-callout-icon);
60
60
  --_ui-callout-icon-size: var(--ui-callout-icon-size);
61
61
 
62
- --_callout-surface: oklch(from var(--_callout-border) l c h / 10%);
62
+ /* Near white, sRGB retains more green chroma than blue/red; bound chroma by hue to avoid clipping. */
63
+ --_callout-surface: light-dark(
64
+ oklch(from var(--_callout-border) 96% min(c, calc(0.02 + 0.03 * max(0, cos(calc((h - 140) * 1deg))))) h),
65
+ oklch(from var(--_callout-border) 25% min(c, 0.035) h)
66
+ );
63
67
  --_ui-selection-context-surface: light-dark(
64
68
  oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l - 0.045) calc(max(c, min(0.045, c * 3))) h),
65
69
  oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l + 0.045) calc(max(c, min(0.045, c * 3))) h)
@@ -39,6 +39,7 @@
39
39
  align-items: center !important;
40
40
  align-content: center !important;
41
41
  gap: var(--ui-space-2) !important;
42
+ inline-size: 100%;
42
43
  min-inline-size: 0;
43
44
  min-block-size: var(--ui-site-header-compact-height, 3.75rem);
44
45
  padding: var(--ui-space-2) var(--ui-site-header-padding-inline, var(--ui-space-4)) !important;
@@ -60,13 +61,16 @@
60
61
  max-inline-size: 100%;
61
62
  }
62
63
  .actions {
63
- flex-wrap: wrap !important;
64
+ display: grid !important;
65
+ grid-auto-flow: column !important;
66
+ grid-auto-columns: minmax(max-content, var(--ui-control-min-block-size)) !important;
67
+ justify-items: center !important;
64
68
  margin-inline-start: auto !important;
65
69
  }
66
70
  /* Text shares a baseline inside one group; the group is centred beside any control height. */
67
71
  .identity {
68
72
  display: flex !important;
69
- flex: 1 1 auto;
73
+ flex: 1 1 0;
70
74
  flex-wrap: wrap !important;
71
75
  align-items: baseline !important;
72
76
  gap: var(--ui-space-2) var(--ui-space-6) !important;
package/vue/UiCallout.vue CHANGED
@@ -325,7 +325,15 @@ const hostState = computed(() =>
325
325
  --_ui-callout-icon: var(--ui-callout-icon);
326
326
  --_ui-callout-icon-size: var(--ui-callout-icon-size);
327
327
 
328
- --_callout-surface: oklch(from var(--_callout-border) l c h / 10%);
328
+ /* Near white, sRGB retains more green chroma than blue/red; bound chroma by hue to avoid clipping. */
329
+ --_callout-surface: light-dark(
330
+ oklch(
331
+ from var(--_callout-border)
332
+ 96% min(c, calc(0.02 + 0.03 * max(0, cos(calc((h - 140) * 1deg)))))
333
+ h
334
+ ),
335
+ oklch(from var(--_callout-border) 25% min(c, 0.035) h)
336
+ );
329
337
  --_ui-selection-context-surface: light-dark(
330
338
  oklch(
331
339
  from var(--ui-callout-surface, var(--_callout-surface))
@@ -172,6 +172,7 @@ const hostState = computed(() =>
172
172
  align-items: center !important;
173
173
  align-content: center !important;
174
174
  gap: var(--ui-space-2) !important;
175
+ inline-size: 100%;
175
176
  min-inline-size: 0;
176
177
  min-block-size: var(--ui-site-header-compact-height, 3.75rem);
177
178
  padding: var(--ui-space-2) var(--ui-site-header-padding-inline, var(--ui-space-4)) !important;
@@ -194,12 +195,15 @@ const hostState = computed(() =>
194
195
  max-inline-size: 100%;
195
196
  }
196
197
  :global(.actions:where([data-hn-ui-site-header])) {
197
- flex-wrap: wrap !important;
198
+ display: grid !important;
199
+ grid-auto-flow: column !important;
200
+ grid-auto-columns: minmax(max-content, var(--ui-control-min-block-size)) !important;
201
+ justify-items: center !important;
198
202
  margin-inline-start: auto !important;
199
203
  }
200
204
  :global(.identity:where([data-hn-ui-site-header])) {
201
205
  display: flex !important;
202
- flex: 1 1 auto;
206
+ flex: 1 1 0;
203
207
  flex-wrap: wrap !important;
204
208
  align-items: baseline !important;
205
209
  gap: var(--ui-space-2) var(--ui-space-6) !important;
@@ -297,6 +297,6 @@ var UiCallout_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
297
297
  }]]);
298
298
  };
299
299
  }
300
- }), [["__scopeId", "data-v-591f8e62"]]);
300
+ }), [["__scopeId", "data-v-15314c87"]]);
301
301
  //#endregion
302
302
  export { UiCallout_default as t };
@@ -145,6 +145,6 @@ var UiSiteHeader_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
145
145
  }]]);
146
146
  };
147
147
  }
148
- }), [["__scopeId", "data-v-a60b14b2"]]);
148
+ }), [["__scopeId", "data-v-32e025db"]]);
149
149
  //#endregion
150
150
  export { UiSiteHeader_default as t };
@@ -1647,7 +1647,15 @@ html[data-ui-input-modality="touch"]
1647
1647
  --_ui-callout-icon: var(--ui-callout-icon);
1648
1648
  --_ui-callout-icon-size: var(--ui-callout-icon-size);
1649
1649
 
1650
- --_callout-surface: oklch(from var(--_callout-border) l c h / 10%);
1650
+ /* Near white, sRGB retains more green chroma than blue/red; bound chroma by hue to avoid clipping. */
1651
+ --_callout-surface: light-dark(
1652
+ oklch(
1653
+ from var(--_callout-border)
1654
+ 96% min(c, calc(0.02 + 0.03 * max(0, cos(calc((h - 140) * 1deg)))))
1655
+ h
1656
+ ),
1657
+ oklch(from var(--_callout-border) 25% min(c, 0.035) h)
1658
+ );
1651
1659
  --_ui-selection-context-surface: light-dark(
1652
1660
  oklch(
1653
1661
  from var(--ui-callout-surface, var(--_callout-surface))
@@ -10619,6 +10627,7 @@ dialog:where([data-hn-ui-search-shell]) {
10619
10627
  align-items: center !important;
10620
10628
  align-content: center !important;
10621
10629
  gap: var(--ui-space-2) !important;
10630
+ inline-size: 100%;
10622
10631
  min-inline-size: 0;
10623
10632
  min-block-size: var(--ui-site-header-compact-height, 3.75rem);
10624
10633
  padding: var(--ui-space-2) var(--ui-site-header-padding-inline, var(--ui-space-4)) !important;
@@ -10640,12 +10649,15 @@ dialog:where([data-hn-ui-search-shell]) {
10640
10649
  max-inline-size: 100%;
10641
10650
  }
10642
10651
  .actions:where([data-hn-ui-site-header]) {
10643
- flex-wrap: wrap !important;
10652
+ display: grid !important;
10653
+ grid-auto-flow: column !important;
10654
+ grid-auto-columns: minmax(max-content, var(--ui-control-min-block-size)) !important;
10655
+ justify-items: center !important;
10644
10656
  margin-inline-start: auto !important;
10645
10657
  }
10646
10658
  .identity:where([data-hn-ui-site-header]) {
10647
10659
  display: flex !important;
10648
- flex: 1 1 auto;
10660
+ flex: 1 1 0;
10649
10661
  flex-wrap: wrap !important;
10650
10662
  align-items: baseline !important;
10651
10663
  gap: var(--ui-space-2) var(--ui-space-6) !important;
@@ -17478,7 +17490,11 @@ html[data-ui-input-modality="touch"]
17478
17490
  --_ui-callout-icon: var(--ui-callout-icon);
17479
17491
  --_ui-callout-icon-size: var(--ui-callout-icon-size);
17480
17492
 
17481
- --_callout-surface: oklch(from var(--_callout-border) l c h / 10%);
17493
+ /* Near white, sRGB retains more green chroma than blue/red; bound chroma by hue to avoid clipping. */
17494
+ --_callout-surface: light-dark(
17495
+ oklch(from var(--_callout-border) 96% min(c, calc(0.02 + 0.03 * max(0, cos(calc((h - 140) * 1deg))))) h),
17496
+ oklch(from var(--_callout-border) 25% min(c, 0.035) h)
17497
+ );
17482
17498
  --_ui-selection-context-surface: light-dark(
17483
17499
  oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l - 0.045) calc(max(c, min(0.045, c * 3))) h),
17484
17500
  oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l + 0.045) calc(max(c, min(0.045, c * 3))) h)