@threadlabs/looma 0.29.16 → 0.29.18

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.
@@ -2,7 +2,11 @@ import { d as list, i as checkHydratedRoot, p as nativeAttrs, r as attribute, s
2
2
  import { a as vPropValidity, n as checkedProp } from "./props.js";
3
3
  import { Fragment, computed, createCommentVNode, createElementBlock, defineComponent, mergeProps, openBlock, renderList, unref, watchSyncEffect, withDirectives } from "vue";
4
4
  //#region .build/vue/UiIcon.vue?vue&type=script&setup=true&lang.ts
5
- var _hoisted_1 = ["data-ui-icon-prop-name"];
5
+ var _hoisted_1 = [
6
+ "data-ui-icon-prop-name",
7
+ "data-ui-icon-prop-tone",
8
+ "data-ui-icon-state"
9
+ ];
6
10
  var _hoisted_2 = {
7
11
  viewBox: "0 0 24 24",
8
12
  fill: "none",
@@ -37,27 +41,59 @@ var _hoisted_6 = [
37
41
  var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
38
42
  inheritAttrs: false,
39
43
  __name: "UiIcon",
40
- props: { name: {
41
- type: null,
42
- default: ""
43
- } },
44
+ props: {
45
+ name: {
46
+ type: null,
47
+ default: ""
48
+ },
49
+ tone: {
50
+ type: null,
51
+ default: "inherit"
52
+ }
53
+ },
44
54
  setup(__props) {
45
- const propValidityContract = { props: { name: {
46
- type: {
47
- kind: "terminal",
48
- name: "string"
55
+ const propValidityContract = { props: {
56
+ name: {
57
+ type: {
58
+ kind: "terminal",
59
+ name: "string"
60
+ },
61
+ required: false,
62
+ target: { attribute: "name" },
63
+ description: "Which icon to draw, by its name in Looma's icon set (LOOMA_ICONS), such as \"align-left\". An unknown or empty name draws nothing. The icon is hidden from\n assistive technology, so name the control it sits in.",
64
+ default: ""
49
65
  },
50
- required: false,
51
- target: { attribute: "name" },
52
- description: "Which icon to draw, by its name in Looma's icon set (LOOMA_ICONS), such as \"align-left\". An unknown or empty name draws nothing. The icon is hidden from\n assistive technology, so name the control it sits in.",
53
- default: ""
54
- } } };
66
+ tone: {
67
+ type: {
68
+ kind: "terminal",
69
+ name: "keyword"
70
+ },
71
+ required: false,
72
+ target: { attribute: "tone" },
73
+ description: "Icon colour. inherit follows its control; secondary and muted keep a supporting icon quiet without a text wrapper.",
74
+ values: [
75
+ "inherit",
76
+ "secondary",
77
+ "muted"
78
+ ],
79
+ default: "inherit"
80
+ }
81
+ } };
55
82
  const props = __props;
56
- const acceptedProps = { name: "" };
57
- const checkedProps = computed(() => ({ name: checkedProp(props["name"], {
58
- kind: "terminal",
59
- name: "string"
60
- }, false, "name", acceptedProps) }));
83
+ const acceptedProps = {
84
+ name: "",
85
+ tone: "inherit"
86
+ };
87
+ const checkedProps = computed(() => ({
88
+ name: checkedProp(props["name"], {
89
+ kind: "terminal",
90
+ name: "string"
91
+ }, false, "name", acceptedProps),
92
+ tone: checkedProp(props["tone"], {
93
+ kind: "terminal",
94
+ name: "keyword"
95
+ }, false, "tone", acceptedProps)
96
+ }));
61
97
  checkedProps.value;
62
98
  watchSyncEffect(() => {
63
99
  checkedProps.value;
@@ -1157,13 +1193,17 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
1157
1193
  }]
1158
1194
  })[checkedProps.value.name]);
1159
1195
  checkHydratedRoot("span", "ui-icon");
1196
+ /** The values the styles' :host() prop and state rules test. */
1197
+ const hostState = computed(() => [checkedProps.value.tone && "tone", checkedProps.value.tone != null && `tone=${encodeURIComponent(checkedProps.value.tone)}`].filter(Boolean).join(" "));
1160
1198
  return (_ctx, _cache) => {
1161
1199
  return withDirectives((openBlock(), createElementBlock("span", mergeProps({
1162
1200
  class: "ui-icon",
1163
1201
  "aria-hidden": "true"
1164
1202
  }, unref(nativeAttrs)(_ctx.$attrs), {
1165
1203
  "data-hn": "",
1166
- "data-ui-icon-prop-name": unref(reflectedProp)("name", "name", checkedProps.value.name, void 0, false)
1204
+ "data-ui-icon-prop-name": unref(reflectedProp)("name", "name", checkedProps.value.name, void 0, false),
1205
+ "data-ui-icon-prop-tone": unref(reflectedProp)("tone", "tone", checkedProps.value.tone, void 0, false),
1206
+ "data-ui-icon-state": hostState.value || void 0
1167
1207
  }), [(openBlock(), createElementBlock("svg", _hoisted_2, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(list)(unref(shapes)), (shape, index) => {
1168
1208
  return openBlock(), createElementBlock("g", { key: index }, [
1169
1209
  shape.tag === "path" ? (openBlock(), createElementBlock("path", {
@@ -1199,6 +1239,6 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
1199
1239
  }]]);
1200
1240
  };
1201
1241
  }
1202
- }), [["__scopeId", "data-v-effc7962"]]);
1242
+ }), [["__scopeId", "data-v-39bdd7d1"]]);
1203
1243
  //#endregion
1204
1244
  export { UiIcon_default as t };
@@ -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 };
@@ -100,6 +100,12 @@
100
100
  inline-size: var(--ui-icon-size, var(--_ui-default-icon-size, 1em));
101
101
  block-size: var(--ui-icon-size, var(--_ui-default-icon-size, 1em));
102
102
  }
103
+ :scope[data-ui-icon-state~="tone=secondary"] {
104
+ color: var(--ui-text-secondary);
105
+ }
106
+ :scope[data-ui-icon-state~="tone=muted"] {
107
+ color: var(--ui-text-muted);
108
+ }
103
109
  svg {
104
110
  inline-size: 100%;
105
111
  block-size: 100%;
@@ -4656,19 +4662,19 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
4656
4662
  transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
4657
4663
  }
4658
4664
  @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]) {
4665
+ :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
4666
  border-color: transparent;
4661
4667
  background-color: transparent;
4662
4668
  box-shadow: none;
4663
4669
  }
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)
4670
+ :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
4671
  .content:where([data-hn-ui-icon-button]) {
4666
4672
  opacity: 0;
4667
4673
  transform: scale(0.65);
4668
4674
  transition-duration: var(--ui-motion-fast);
4669
4675
  }
4670
4676
  }
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 {
4677
+ :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
4678
  opacity: 0;
4673
4679
  }
4674
4680
  :scope:where([data-hn-ui-icon-button]) {
@@ -10361,11 +10367,30 @@ html[data-ui-input-modality="touch"]
10361
10367
  }
10362
10368
  @media (pointer: coarse) { .looma-compact-editor { font-size: var(--ui-font-size-md); } }
10363
10369
  /* The editor surface owns its renderer canvas. Existing hooks retain their defaults. */
10370
+ /* Native TOC wrappers position the composed control beyond the active-block guide.
10371
+ The IconButton itself owns its dot, motion, focus and touch treatment. */
10372
+ .looma-editor .ProseMirror nav[data-looma-toc] {
10373
+ position: relative;
10374
+ }
10375
+
10376
+ .looma-editor .ProseMirror [data-looma-toc-gutter] {
10377
+ position: absolute;
10378
+ inset-block-start: calc(-1 * var(--ui-space-1));
10379
+ inset-inline-end: calc(100% + var(--ui-editor-active-block-offset, var(--ui-space-3)) + var(--ui-space-1));
10380
+ display: flex;
10381
+ }
10382
+
10383
+ /* Default canvases reserve the author gutter; consumers with their own outer
10384
+ gutter retain their explicit content-padding hook. Compact readers need none. */
10385
+ .looma-editor .ProseMirror:has([data-looma-toc-gutter]:not([hidden])) {
10386
+ --_ui-editor-toc-gutter: calc(var(--ui-space-6) + var(--ui-space-4));
10387
+ }
10388
+
10364
10389
  :is([data-component~="ui-editor-surface"], .ui-editor-surface) .ProseMirror {
10365
10390
  min-height: var(--ui-editor-content-min-height, var(--_ui-editor-content-min-height, 300px));
10366
10391
  padding:
10367
10392
  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)));
10393
+ var(--ui-editor-content-padding-inline, var(--_ui-editor-content-padding-inline, var(--_ui-editor-toc-gutter, var(--ui-space-6))));
10369
10394
  outline: none;
10370
10395
  color: var(--ui-editor-content-color, var(--ui-text-primary));
10371
10396
  caret-color: var(--ui-editor-caret-color, var(--ui-accent-solid));
@@ -11520,6 +11545,40 @@ html[data-ui-input-modality="touch"]
11520
11545
  :where([data-slotted]:not([data-component])) { --html-next-scope-owner: projected !important; }
11521
11546
  }
11522
11547
  @supports (-moz-appearance: none) {
11548
+ [data-component~="ui-affordance-scope"] { --html-next-scope-owner: "ui-affordance-scope" !important; }
11549
+ }
11550
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component], [data-slotted]) {
11551
+ :scope:where([data-component~="ui-affordance-scope"]) {
11552
+ display: contents;
11553
+ --ui-affordance-scope-engaged: 0;
11554
+ --ui-affordance-scope-guide: 1;
11555
+ }
11556
+
11557
+ :scope:where([data-component~="ui-affordance-scope"])[data-ui-affordance-scope-state~="engaged"] {
11558
+ --ui-affordance-scope-engaged: 1;
11559
+ }
11560
+
11561
+ /* Published to descendants: each guide multiplies its opacity by it, so none reaches them all. */
11562
+ :scope:where([data-component~="ui-affordance-scope"])[data-ui-affordance-scope-state~="guide=none"] {
11563
+ --ui-affordance-scope-guide: 0;
11564
+ }
11565
+
11566
+ /* A component that sets its display still honours the hidden attribute on its root. */
11567
+ :scope:where([data-component~="ui-affordance-scope"])[hidden] {
11568
+ display: none;
11569
+ }
11570
+ }
11571
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component]) {
11572
+ /* Published to descendants: each guide multiplies its opacity by it, so none reaches them all. */
11573
+
11574
+ /* A component that sets its display still honours the hidden attribute on its root. */
11575
+ }
11576
+ /* Generated by HTML Next 1.0.0-alpha.57. Do not edit. */
11577
+ @supports (-moz-appearance: none) {
11578
+ :where([data-component], [data-slotted]) { --html-next-scope-owner: boundary; }
11579
+ :where([data-slotted]:not([data-component])) { --html-next-scope-owner: projected !important; }
11580
+ }
11581
+ @supports (-moz-appearance: none) {
11523
11582
  [data-component~="ui-cluster"] { --html-next-scope-owner: "ui-cluster" !important; }
11524
11583
  }
11525
11584
  @scope ([data-component~="ui-cluster"]) to ([data-component], [data-slotted]) {
@@ -11776,6 +11835,14 @@ html[data-ui-input-modality="touch"]
11776
11835
  block-size: var(--ui-icon-size, var(--_ui-default-icon-size, 1em));
11777
11836
  }
11778
11837
 
11838
+ :scope:where([data-component~="ui-icon"])[data-ui-icon-state~="tone=secondary"] {
11839
+ color: var(--ui-text-secondary);
11840
+ }
11841
+
11842
+ :scope:where([data-component~="ui-icon"])[data-ui-icon-state~="tone=muted"] {
11843
+ color: var(--ui-text-muted);
11844
+ }
11845
+
11779
11846
  svg {
11780
11847
  inline-size: 100%;
11781
11848
  block-size: 100%;
@@ -11956,13 +12023,13 @@ html[data-ui-input-modality="touch"]
11956
12023
  }
11957
12024
 
11958
12025
  @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) {
12026
+ :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
12027
  border-color: transparent;
11961
12028
  background-color: transparent;
11962
12029
  box-shadow: none;
11963
12030
  }
11964
12031
 
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)
12032
+ :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
12033
  .content {
11967
12034
  opacity: 0;
11968
12035
  transform: scale(0.65);
@@ -11970,7 +12037,7 @@ html[data-ui-input-modality="touch"]
11970
12037
  }
11971
12038
  }
11972
12039
 
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 {
12040
+ :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
12041
  opacity: 0;
11975
12042
  }
11976
12043