@threadlabs/looma 0.29.16 → 0.29.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.29.16",
3
+ "version": "0.29.17",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -162,13 +162,13 @@
162
162
  }
163
163
 
164
164
  @media (hover: hover) and (pointer: fine) {
165
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
165
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
166
166
  border-color: transparent;
167
167
  background-color: transparent;
168
168
  box-shadow: none;
169
169
  }
170
170
 
171
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
171
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
172
172
  .content {
173
173
  opacity: 0;
174
174
  transform: scale(0.65);
@@ -176,7 +176,7 @@
176
176
  }
177
177
  }
178
178
 
179
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:is(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
179
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:is(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
180
180
  opacity: 0;
181
181
  }
182
182
 
@@ -13,6 +13,7 @@ export interface UiIconButtonProps {
13
13
  loading?: boolean | null;
14
14
  matchButton?: boolean | null;
15
15
  pending?: boolean | null;
16
+ revealed?: boolean | null;
16
17
  round?: boolean | null;
17
18
  size?: "sm" | "md" | "lg" | null;
18
19
  tone?: "accent" | "neutral" | null;
@@ -8,7 +8,7 @@ const T1 = ["ui-spinner",["size","sm"]];
8
8
  const T2 = ["",[]];
9
9
  let P0, P1, P2;
10
10
  const S = { n: [], t: [], f: import.meta.url, g: "ui-icon-button" };
11
- const D = { g: "ui-icon-button", props: { "anticipatory": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "disabled": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "guide": { "required":false,"values":["dot","bar"],"default":"dot", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "label": { "required":false, c: checkString, t: "string", j: 0, m: "s" }, "loading": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "matchButton": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "pending": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "round": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "size": { "required":false,"values":["sm","md","lg"],"default":"md", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "tone": { "required":false,"values":["accent","neutral"], c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "variant": { "required":false,"values":["ghost","outline","solid"],"default":"ghost", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] } } };
11
+ const D = { g: "ui-icon-button", props: { "anticipatory": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "disabled": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "guide": { "required":false,"values":["dot","bar"],"default":"dot", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "label": { "required":false, c: checkString, t: "string", j: 0, m: "s" }, "loading": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "matchButton": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "pending": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "revealed": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "round": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "size": { "required":false,"values":["sm","md","lg"],"default":"md", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "tone": { "required":false,"values":["accent","neutral"], c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "variant": { "required":false,"values":["ghost","outline","solid"],"default":"ghost", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] } } };
12
12
  const C = (host) => controller.default(host);
13
13
 
14
14
  export function createUiIconButton(options = {}, html) {
@@ -21,7 +21,7 @@ export function createUiIconButton(options = {}, html) {
21
21
  if (!element.hasAttribute("type")) element.setAttribute("type", "button");
22
22
  element.setAttribute("data-component", "ui-icon-button");
23
23
  element.append((P0 ??= buildTemplate(T0)).cloneNode(true));
24
- const v = [null, null, null, null, null, null, null, null, null, null, null];
24
+ const v = [null, null, null, null, null, null, null, null, null, null, null, null];
25
25
  const B = acceptProps(element, D, S.n, v, componentProps, [], html);
26
26
  const m1 = (d) => {
27
27
  const n = (P1 ??= buildTemplate(T1)).cloneNode(true);
@@ -67,8 +67,8 @@ export function createUiIconButton(options = {}, html) {
67
67
  const s4 = toAttribute(x4, "aria-busy");
68
68
  if (s4 !== r.v4) writeAttribute(r.n, "aria-busy", r.v4 = s4);
69
69
  }
70
- if (c & 2037) {
71
- const x5 = hostState(["tone","anticipatory","guide","variant","loading","pending","size","matchButton","round"], [v[9], v[0], v[2], v[10], v[4], v[6], v[8], v[5], v[7]]);
70
+ if (c & 4085) {
71
+ const x5 = hostState(["tone","anticipatory","guide","revealed","variant","loading","pending","size","matchButton","round"], [v[10], v[0], v[2], v[7], v[11], v[4], v[6], v[9], v[5], v[8]]);
72
72
  const s5 = x5;
73
73
  if (s5 !== r.v5) writeAttribute(r.n, "data-ui-icon-button-state", (r.v5 = s5) === "" ? null : s5);
74
74
  }
@@ -32,6 +32,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
32
32
  type: PropType<boolean | null>;
33
33
  default: boolean;
34
34
  };
35
+ revealed: {
36
+ type: PropType<boolean | null>;
37
+ default: boolean;
38
+ };
35
39
  round: {
36
40
  type: PropType<boolean | null>;
37
41
  default: boolean;
@@ -77,6 +81,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
77
81
  type: PropType<boolean | null>;
78
82
  default: boolean;
79
83
  };
84
+ revealed: {
85
+ type: PropType<boolean | null>;
86
+ default: boolean;
87
+ };
80
88
  round: {
81
89
  type: PropType<boolean | null>;
82
90
  default: boolean;
@@ -104,6 +112,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
104
112
  loading: boolean | null;
105
113
  pending: boolean | null;
106
114
  anticipatory: boolean | null;
115
+ revealed: boolean | null;
107
116
  matchButton: boolean | null;
108
117
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
109
118
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -72,6 +72,14 @@ const propValidityContract = {
72
72
  description: 'Deprecated alias for loading.',
73
73
  default: false,
74
74
  },
75
+ revealed: {
76
+ type: { kind: 'terminal', name: 'boolean' },
77
+ required: false,
78
+ target: { attribute: 'revealed' },
79
+ description:
80
+ 'Keeps an anticipatory button visible while its context is active, such as a selected block or an open popup. It does not imply a pressed or expanded state.',
81
+ default: false,
82
+ },
75
83
  round: {
76
84
  type: { kind: 'terminal', name: 'boolean' },
77
85
  required: false,
@@ -115,6 +123,7 @@ const props = defineProps({
115
123
  loading: { type: null as unknown as PropType<boolean | null>, default: false },
116
124
  matchButton: { type: null as unknown as PropType<boolean | null>, default: false },
117
125
  pending: { type: null as unknown as PropType<boolean | null>, default: false },
126
+ revealed: { type: null as unknown as PropType<boolean | null>, default: false },
118
127
  round: { type: null as unknown as PropType<boolean | null>, default: false },
119
128
  size: { type: null as unknown as PropType<'sm' | 'md' | 'lg' | null>, default: 'md' },
120
129
  tone: { type: null as unknown as PropType<'accent' | 'neutral' | null>, default: null },
@@ -131,6 +140,7 @@ const acceptedProps: Record<string, unknown> = {
131
140
  loading: false,
132
141
  matchButton: false,
133
142
  pending: false,
143
+ revealed: false,
134
144
  round: false,
135
145
  size: 'md',
136
146
  tone: null,
@@ -186,6 +196,13 @@ const checkedProps = computed(() => ({
186
196
  'pending',
187
197
  acceptedProps,
188
198
  ) as boolean,
199
+ revealed: checkedProp<boolean>(
200
+ props['revealed'],
201
+ { kind: 'terminal', name: 'boolean' },
202
+ false,
203
+ 'revealed',
204
+ acceptedProps,
205
+ ) as boolean,
189
206
  round: checkedProp<boolean>(
190
207
  props['round'],
191
208
  { kind: 'terminal', name: 'boolean' },
@@ -271,6 +288,7 @@ const hostState = computed(() =>
271
288
  checkedProps.value.anticipatory && 'anticipatory',
272
289
  checkedProps.value.guide && 'guide',
273
290
  checkedProps.value.guide != null && `guide=${encodeURIComponent(checkedProps.value.guide)}`,
291
+ checkedProps.value.revealed && 'revealed',
274
292
  checkedProps.value.variant && 'variant',
275
293
  checkedProps.value.variant != null
276
294
  && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
@@ -308,6 +326,7 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
308
326
  'loading',
309
327
  'matchButton',
310
328
  'pending',
329
+ 'revealed',
311
330
  'round',
312
331
  'size',
313
332
  'tone',
@@ -338,6 +357,7 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
338
357
  :data-ui-icon-button-prop-loading="reflectedProp('loading', 'loading', checkedProps.loading, undefined, false)"
339
358
  :data-ui-icon-button-prop-match-button="reflectedProp('matchButton', 'match-button', checkedProps.matchButton, undefined, false)"
340
359
  :data-ui-icon-button-prop-pending="reflectedProp('pending', 'pending', checkedProps.pending, undefined, false)"
360
+ :data-ui-icon-button-prop-revealed="reflectedProp('revealed', 'revealed', checkedProps.revealed, undefined, false)"
341
361
  :data-ui-icon-button-prop-round="reflectedProp('round', 'round', checkedProps.round, undefined, false)"
342
362
  :data-ui-icon-button-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
343
363
  :data-ui-icon-button-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
@@ -534,13 +554,13 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
534
554
  }
535
555
 
536
556
  @media (hover: hover) and (pointer: fine) {
537
- :global(:scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])) {
557
+ :global(:scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])) {
538
558
  border-color: transparent;
539
559
  background-color: transparent;
540
560
  box-shadow: none;
541
561
  }
542
562
 
543
- :global(:scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
563
+ :global(:scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
544
564
  .content:where([data-hn-ui-icon-button])) {
545
565
  opacity: 0;
546
566
  transform: scale(0.65);
@@ -548,7 +568,7 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
548
568
  }
549
569
  }
550
570
 
551
- :global(:scope[data-ui-icon-button-state~="anticipatory"]:is(:scope[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])::before) {
571
+ :global(:scope[data-ui-icon-button-state~="anticipatory"]:is(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])::before) {
552
572
  opacity: 0;
553
573
  }
554
574
 
@@ -16,6 +16,7 @@ var _hoisted_1 = [
16
16
  "data-ui-icon-button-prop-loading",
17
17
  "data-ui-icon-button-prop-match-button",
18
18
  "data-ui-icon-button-prop-pending",
19
+ "data-ui-icon-button-prop-revealed",
19
20
  "data-ui-icon-button-prop-round",
20
21
  "data-ui-icon-button-prop-size",
21
22
  "data-ui-icon-button-prop-tone",
@@ -60,6 +61,10 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
60
61
  type: null,
61
62
  default: false
62
63
  },
64
+ revealed: {
65
+ type: null,
66
+ default: false
67
+ },
63
68
  round: {
64
69
  type: null,
65
70
  default: false
@@ -149,6 +154,16 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
149
154
  description: "Deprecated alias for loading.",
150
155
  default: false
151
156
  },
157
+ revealed: {
158
+ type: {
159
+ kind: "terminal",
160
+ name: "boolean"
161
+ },
162
+ required: false,
163
+ target: { attribute: "revealed" },
164
+ description: "Keeps an anticipatory button visible while its context is active, such as a selected block or an open popup. It does not imply a pressed or expanded state.",
165
+ default: false
166
+ },
152
167
  round: {
153
168
  type: {
154
169
  kind: "terminal",
@@ -209,6 +224,7 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
209
224
  loading: false,
210
225
  matchButton: false,
211
226
  pending: false,
227
+ revealed: false,
212
228
  round: false,
213
229
  size: "md",
214
230
  tone: null,
@@ -243,6 +259,10 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
243
259
  kind: "terminal",
244
260
  name: "boolean"
245
261
  }, false, "pending", acceptedProps),
262
+ revealed: checkedProp(props["revealed"], {
263
+ kind: "terminal",
264
+ name: "boolean"
265
+ }, false, "revealed", acceptedProps),
246
266
  round: checkedProp(props["round"], {
247
267
  kind: "terminal",
248
268
  name: "boolean"
@@ -292,6 +312,7 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
292
312
  checkedProps.value.anticipatory && "anticipatory",
293
313
  checkedProps.value.guide && "guide",
294
314
  checkedProps.value.guide != null && `guide=${encodeURIComponent(checkedProps.value.guide)}`,
315
+ checkedProps.value.revealed && "revealed",
295
316
  checkedProps.value.variant && "variant",
296
317
  checkedProps.value.variant != null && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
297
318
  checkedProps.value.loading && "loading",
@@ -323,6 +344,7 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
323
344
  "loading",
324
345
  "matchButton",
325
346
  "pending",
347
+ "revealed",
326
348
  "round",
327
349
  "size",
328
350
  "tone",
@@ -352,6 +374,7 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
352
374
  "data-ui-icon-button-prop-loading": unref(reflectedProp)("loading", "loading", checkedProps.value.loading, void 0, false),
353
375
  "data-ui-icon-button-prop-match-button": unref(reflectedProp)("matchButton", "match-button", checkedProps.value.matchButton, void 0, false),
354
376
  "data-ui-icon-button-prop-pending": unref(reflectedProp)("pending", "pending", checkedProps.value.pending, void 0, false),
377
+ "data-ui-icon-button-prop-revealed": unref(reflectedProp)("revealed", "revealed", checkedProps.value.revealed, void 0, false),
355
378
  "data-ui-icon-button-prop-round": unref(reflectedProp)("round", "round", checkedProps.value.round, void 0, false),
356
379
  "data-ui-icon-button-prop-size": unref(reflectedProp)("size", "size", checkedProps.value.size, void 0, false),
357
380
  "data-ui-icon-button-prop-tone": unref(reflectedProp)("tone", "tone", checkedProps.value.tone, void 0, false),
@@ -373,6 +396,6 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
373
396
  }]]);
374
397
  };
375
398
  }
376
- }), [["__scopeId", "data-v-5994f52f"]]);
399
+ }), [["__scopeId", "data-v-213e5302"]]);
377
400
  //#endregion
378
401
  export { UiIconButton_default as t };
@@ -4656,19 +4656,19 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
4656
4656
  transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
4657
4657
  }
4658
4658
  @media (hover: hover) and (pointer: fine) {
4659
- :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button]) {
4659
+ :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button]) {
4660
4660
  border-color: transparent;
4661
4661
  background-color: transparent;
4662
4662
  box-shadow: none;
4663
4663
  }
4664
- :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
4664
+ :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
4665
4665
  .content:where([data-hn-ui-icon-button]) {
4666
4666
  opacity: 0;
4667
4667
  transform: scale(0.65);
4668
4668
  transition-duration: var(--ui-motion-fast);
4669
4669
  }
4670
4670
  }
4671
- :scope[data-ui-icon-button-state~="anticipatory"]:is(:scope[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])::before {
4671
+ :scope[data-ui-icon-button-state~="anticipatory"]:is(:scope[data-ui-icon-button-state~="revealed"], :scope[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible):where([data-hn-ui-icon-button])::before {
4672
4672
  opacity: 0;
4673
4673
  }
4674
4674
  :scope:where([data-hn-ui-icon-button]) {
@@ -10361,11 +10361,30 @@ html[data-ui-input-modality="touch"]
10361
10361
  }
10362
10362
  @media (pointer: coarse) { .looma-compact-editor { font-size: var(--ui-font-size-md); } }
10363
10363
  /* The editor surface owns its renderer canvas. Existing hooks retain their defaults. */
10364
+ /* Native TOC wrappers position the composed control beyond the active-block guide.
10365
+ The IconButton itself owns its dot, motion, focus and touch treatment. */
10366
+ .looma-editor .ProseMirror nav[data-looma-toc] {
10367
+ position: relative;
10368
+ }
10369
+
10370
+ .looma-editor .ProseMirror [data-looma-toc-gutter] {
10371
+ position: absolute;
10372
+ inset-block-start: calc(-1 * var(--ui-space-1));
10373
+ inset-inline-end: calc(100% + var(--ui-editor-active-block-offset, var(--ui-space-3)) + var(--ui-space-1));
10374
+ display: flex;
10375
+ }
10376
+
10377
+ /* Default canvases reserve the author gutter; consumers with their own outer
10378
+ gutter retain their explicit content-padding hook. Compact readers need none. */
10379
+ .looma-editor .ProseMirror:has([data-looma-toc-gutter]:not([hidden])) {
10380
+ --_ui-editor-toc-gutter: calc(var(--ui-space-6) + var(--ui-space-4));
10381
+ }
10382
+
10364
10383
  :is([data-component~="ui-editor-surface"], .ui-editor-surface) .ProseMirror {
10365
10384
  min-height: var(--ui-editor-content-min-height, var(--_ui-editor-content-min-height, 300px));
10366
10385
  padding:
10367
10386
  var(--ui-editor-content-padding-block, var(--_ui-editor-content-padding-block, var(--ui-space-4)))
10368
- var(--ui-editor-content-padding-inline, var(--_ui-editor-content-padding-inline, var(--ui-space-6)));
10387
+ var(--ui-editor-content-padding-inline, var(--_ui-editor-content-padding-inline, var(--_ui-editor-toc-gutter, var(--ui-space-6))));
10369
10388
  outline: none;
10370
10389
  color: var(--ui-editor-content-color, var(--ui-text-primary));
10371
10390
  caret-color: var(--ui-editor-caret-color, var(--ui-accent-solid));
@@ -11520,6 +11539,40 @@ html[data-ui-input-modality="touch"]
11520
11539
  :where([data-slotted]:not([data-component])) { --html-next-scope-owner: projected !important; }
11521
11540
  }
11522
11541
  @supports (-moz-appearance: none) {
11542
+ [data-component~="ui-affordance-scope"] { --html-next-scope-owner: "ui-affordance-scope" !important; }
11543
+ }
11544
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component], [data-slotted]) {
11545
+ :scope:where([data-component~="ui-affordance-scope"]) {
11546
+ display: contents;
11547
+ --ui-affordance-scope-engaged: 0;
11548
+ --ui-affordance-scope-guide: 1;
11549
+ }
11550
+
11551
+ :scope:where([data-component~="ui-affordance-scope"])[data-ui-affordance-scope-state~="engaged"] {
11552
+ --ui-affordance-scope-engaged: 1;
11553
+ }
11554
+
11555
+ /* Published to descendants: each guide multiplies its opacity by it, so none reaches them all. */
11556
+ :scope:where([data-component~="ui-affordance-scope"])[data-ui-affordance-scope-state~="guide=none"] {
11557
+ --ui-affordance-scope-guide: 0;
11558
+ }
11559
+
11560
+ /* A component that sets its display still honours the hidden attribute on its root. */
11561
+ :scope:where([data-component~="ui-affordance-scope"])[hidden] {
11562
+ display: none;
11563
+ }
11564
+ }
11565
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component]) {
11566
+ /* Published to descendants: each guide multiplies its opacity by it, so none reaches them all. */
11567
+
11568
+ /* A component that sets its display still honours the hidden attribute on its root. */
11569
+ }
11570
+ /* Generated by HTML Next 1.0.0-alpha.57. Do not edit. */
11571
+ @supports (-moz-appearance: none) {
11572
+ :where([data-component], [data-slotted]) { --html-next-scope-owner: boundary; }
11573
+ :where([data-slotted]:not([data-component])) { --html-next-scope-owner: projected !important; }
11574
+ }
11575
+ @supports (-moz-appearance: none) {
11523
11576
  [data-component~="ui-cluster"] { --html-next-scope-owner: "ui-cluster" !important; }
11524
11577
  }
11525
11578
  @scope ([data-component~="ui-cluster"]) to ([data-component], [data-slotted]) {
@@ -11956,13 +12009,13 @@ html[data-ui-input-modality="touch"]
11956
12009
  }
11957
12010
 
11958
12011
  @media (hover: hover) and (pointer: fine) {
11959
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
12012
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
11960
12013
  border-color: transparent;
11961
12014
  background-color: transparent;
11962
12015
  box-shadow: none;
11963
12016
  }
11964
12017
 
11965
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
12018
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:not(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="loading"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
11966
12019
  .content {
11967
12020
  opacity: 0;
11968
12021
  transform: scale(0.65);
@@ -11970,7 +12023,7 @@ html[data-ui-input-modality="touch"]
11970
12023
  }
11971
12024
  }
11972
12025
 
11973
- :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:is(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
12026
+ :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"]:is(:scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="revealed"], :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
11974
12027
  opacity: 0;
11975
12028
  }
11976
12029