@threadlabs/looma 0.15.7 → 0.16.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.15.7",
3
+ "version": "0.16.0",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -12,6 +12,7 @@ export interface UiDialogProps {
12
12
  closedby?: "any" | "closerequest" | "none" | null;
13
13
  for?: string | null;
14
14
  label?: string | null;
15
+ modal?: boolean | null;
15
16
  modeless?: boolean | null;
16
17
  open?: boolean | null;
17
18
  size?: "sm" | "md" | "lg" | "fullscreen" | null;
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-dialog/ui-dialog.js";
4
4
  import "../styles/ui-dialog.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-dialog","props":{"alert":{"type":"boolean","required":false,"target":{"attribute":"alert"},"default":false},"closedby":{"type":{"enum":["any","closerequest","none"]},"required":false,"target":{"attribute":"closedby"},"default":"closerequest"},"for":{"type":"string","required":false,"target":{"attribute":"for"},"default":""},"label":{"type":"string","required":false,"target":{"attribute":"label"}},"modeless":{"type":"boolean","required":false,"target":{"attribute":"modeless"},"default":false},"open":{"type":"boolean","required":false,"target":{"attribute":"open"},"default":false},"size":{"type":{"enum":["sm","md","lg","fullscreen"]},"required":false,"target":{"attribute":"size"},"default":"md"}}},"template":{"kind":"element","name":"dialog","attributes":[{"kind":"attribute","name":"aria-label","expression":"accessibleLabel","expressionPlan":{"source":"accessibleLabel","ast":{"kind":"id","name":"accessibleLabel"},"dependencies":["accessibleLabel"]}}],"children":[{"kind":"element","name":"header","attributes":[],"children":[{"kind":"element","name":"h2","attributes":[{"kind":"literal","name":"class","value":"title"},{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[],"flow":{"kind":"if","test":"label","testPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}},{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"close"},{"kind":"literal","name":"type","value":"button"},{"kind":"literal","name":"aria-label","value":"Close"}],"children":[],"ref":"close"}]},{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"body"}],"children":[{"kind":"slot"}]},{"kind":"element","name":"footer","attributes":[],"children":[{"kind":"slot","fallback":[],"name":"actions"}]}]},"declarations":[{"kind":"state","name":"internalOpen","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"accessibleLabel","expression":{"source":"'Dialog'","ast":{"kind":"literal","value":"Dialog"},"dependencies":[]}},{"kind":"event","name":"open","type":"object({ open: boolean, reason: action | programmatic, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"close","type":"object({ open: boolean, reason: action | programmatic | light-dismiss | escape, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"dialog","choices":["dialog"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-dialog","props":{"alert":{"type":"boolean","required":false,"target":{"attribute":"alert"},"default":false},"closedby":{"type":{"enum":["any","closerequest","none"]},"required":false,"target":{"attribute":"closedby"}},"for":{"type":"string","required":false,"target":{"attribute":"for"},"default":""},"label":{"type":"string","required":false,"target":{"attribute":"label"}},"modal":{"type":"boolean","required":false,"target":{"attribute":"modal"},"default":false},"modeless":{"type":"boolean","required":false,"target":{"attribute":"modeless"},"default":false},"open":{"type":"boolean","required":false,"target":{"attribute":"open"},"default":false},"size":{"type":{"enum":["sm","md","lg","fullscreen"]},"required":false,"target":{"attribute":"size"},"default":"md"}}},"template":{"kind":"element","name":"dialog","attributes":[{"kind":"attribute","name":"aria-label","expression":"accessibleLabel","expressionPlan":{"source":"accessibleLabel","ast":{"kind":"id","name":"accessibleLabel"},"dependencies":["accessibleLabel"]}}],"children":[{"kind":"element","name":"header","attributes":[],"children":[{"kind":"element","name":"h2","attributes":[{"kind":"literal","name":"class","value":"title"},{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[],"flow":{"kind":"if","test":"label","testPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}},{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"close"},{"kind":"literal","name":"type","value":"button"},{"kind":"literal","name":"aria-label","value":"Close"}],"children":[],"ref":"close"}]},{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"body"}],"children":[{"kind":"slot"}]},{"kind":"element","name":"footer","attributes":[],"children":[{"kind":"slot","fallback":[],"name":"actions"}]}]},"declarations":[{"kind":"state","name":"internalOpen","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"accessibleLabel","expression":{"source":"'Dialog'","ast":{"kind":"literal","value":"Dialog"},"dependencies":[]}},{"kind":"event","name":"open","type":"object({ open: boolean, reason: action | programmatic, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"close","type":"object({ open: boolean, reason: action | programmatic | light-dismiss | escape, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"dialog","choices":["dialog"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiDialog(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
package/vue/UiDialog.d.ts CHANGED
@@ -3,6 +3,7 @@ type __VLS_Props = {
3
3
  closedby?: 'any' | 'closerequest' | 'none';
4
4
  for?: string;
5
5
  label?: string;
6
+ modal?: boolean;
6
7
  modeless?: boolean;
7
8
  open?: boolean;
8
9
  size?: 'sm' | 'md' | 'lg' | 'fullscreen';
@@ -42,7 +43,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
42
43
  for: string;
43
44
  open: boolean;
44
45
  alert: boolean;
45
- closedby: "any" | "closerequest" | "none";
46
+ modal: boolean;
46
47
  modeless: boolean;
47
48
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
48
49
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
package/vue/UiDialog.vue CHANGED
@@ -12,14 +12,15 @@ const props = withDefaults(
12
12
  closedby?: 'any' | 'closerequest' | 'none'
13
13
  for?: string
14
14
  label?: string
15
+ modal?: boolean
15
16
  modeless?: boolean
16
17
  open?: boolean
17
18
  size?: 'sm' | 'md' | 'lg' | 'fullscreen'
18
19
  }>(),
19
20
  {
20
21
  alert: false,
21
- closedby: 'closerequest',
22
22
  for: '',
23
+ modal: false,
23
24
  modeless: false,
24
25
  open: false,
25
26
  size: 'md',
@@ -31,8 +31,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
31
31
  }>, {
32
32
  label: string;
33
33
  open: boolean;
34
- dismissible: boolean;
35
34
  modal: boolean;
35
+ dismissible: boolean;
36
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
37
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
38
  declare const _default: typeof __VLS_export;
@@ -25,9 +25,13 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
25
25
  type: Boolean,
26
26
  default: false
27
27
  },
28
- closedby: { default: "closerequest" },
28
+ closedby: {},
29
29
  for: { default: "" },
30
30
  label: {},
31
+ modal: {
32
+ type: Boolean,
33
+ default: false
34
+ },
31
35
  modeless: {
32
36
  type: Boolean,
33
37
  default: false
@@ -92,6 +96,6 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
92
96
  ], 16, _hoisted_1);
93
97
  };
94
98
  }
95
- }), [["__scopeId", "data-v-8d67e1e0"]]);
99
+ }), [["__scopeId", "data-v-ef5a672e"]]);
96
100
  //#endregion
97
101
  export { UiDialog_default as t };
@@ -2214,7 +2214,7 @@ dd[data-v-6e5b491d] {
2214
2214
  syntax: "*";
2215
2215
  inherits: false;
2216
2216
  }
2217
- [data-component~="ui-dialog"][data-v-8d67e1e0] {
2217
+ [data-component~="ui-dialog"][data-v-ef5a672e] {
2218
2218
  /* Hooks do not inherit, so the parts below read them from the root. */
2219
2219
  --_ui-dialog-duration: var(--ui-dialog-duration);
2220
2220
 
@@ -2249,21 +2249,21 @@ dd[data-v-6e5b491d] {
2249
2249
  display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2250
2250
  overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2251
2251
  }
2252
- [data-component~="ui-dialog"][open][data-v-8d67e1e0] {
2252
+ [data-component~="ui-dialog"][open][data-v-ef5a672e] {
2253
2253
  display: flex;
2254
2254
  visibility: visible;
2255
2255
  pointer-events: auto;
2256
2256
  opacity: 1;
2257
2257
  transform: scale(1);
2258
- animation: ui-dialog-enter-8d67e1e0 var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2258
+ animation: ui-dialog-enter-ef5a672e var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2259
2259
  }
2260
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-8d67e1e0] {
2260
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-ef5a672e] {
2261
2261
  --_ui-dialog-size: 360px;
2262
2262
  }
2263
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-8d67e1e0] {
2263
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-ef5a672e] {
2264
2264
  --_ui-dialog-size: 640px;
2265
2265
  }
2266
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-8d67e1e0] {
2266
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-ef5a672e] {
2267
2267
  inset: 0;
2268
2268
  inline-size: 100%;
2269
2269
  block-size: 100dvh;
@@ -2271,12 +2271,12 @@ dd[data-v-6e5b491d] {
2271
2271
  margin: 0;
2272
2272
  border-radius: var(--ui-dialog-radius, 0);
2273
2273
  }
2274
- [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-8d67e1e0] {
2274
+ [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-ef5a672e] {
2275
2275
  display: none;
2276
2276
  }
2277
2277
 
2278
2278
  /* Header and actions stay pinned; only the body scrolls when content is long. */
2279
- header[data-v-8d67e1e0] {
2279
+ header[data-v-ef5a672e] {
2280
2280
  display: flex;
2281
2281
  align-items: center;
2282
2282
  gap: var(--ui-space-3);
@@ -2286,7 +2286,7 @@ header[data-v-8d67e1e0] {
2286
2286
  }
2287
2287
 
2288
2288
  /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
2289
- [data-component~="ui-dialog"] .title[data-v-8d67e1e0] {
2289
+ [data-component~="ui-dialog"] .title[data-v-ef5a672e] {
2290
2290
  flex: 1;
2291
2291
  min-inline-size: 0;
2292
2292
  margin: 0;
@@ -2298,7 +2298,7 @@ header[data-v-8d67e1e0] {
2298
2298
  font-weight: var(--ui-font-semibold);
2299
2299
  line-height: var(--ui-line-height-tight);
2300
2300
  }
2301
- .close[data-v-8d67e1e0] {
2301
+ .close[data-v-ef5a672e] {
2302
2302
  display: inline-grid;
2303
2303
  place-items: center;
2304
2304
  flex: none;
@@ -2317,8 +2317,8 @@ header[data-v-8d67e1e0] {
2317
2317
  }
2318
2318
 
2319
2319
  /* A CSS-drawn X. */
2320
- .close[data-v-8d67e1e0]::before,
2321
- .close[data-v-8d67e1e0]::after {
2320
+ .close[data-v-ef5a672e]::before,
2321
+ .close[data-v-ef5a672e]::after {
2322
2322
  content: "";
2323
2323
  grid-area: 1 / 1;
2324
2324
  inline-size: 0.875rem;
@@ -2327,30 +2327,30 @@ header[data-v-8d67e1e0] {
2327
2327
  background: currentColor;
2328
2328
  transform: rotate(45deg);
2329
2329
  }
2330
- .close[data-v-8d67e1e0]::after {
2330
+ .close[data-v-ef5a672e]::after {
2331
2331
  transform: rotate(-45deg);
2332
2332
  }
2333
- .close[data-v-8d67e1e0]:hover {
2333
+ .close[data-v-ef5a672e]:hover {
2334
2334
  background: var(--ui-surface-muted);
2335
2335
  color: var(--ui-text-primary);
2336
2336
  }
2337
- .close[data-v-8d67e1e0]:focus-visible {
2337
+ .close[data-v-ef5a672e]:focus-visible {
2338
2338
  outline: 2px solid var(--ui-focus-ring);
2339
2339
  outline-offset: 2px;
2340
2340
  }
2341
2341
 
2342
2342
  /* A touch target, like Button on coarse pointers. */
2343
2343
  @media (pointer: coarse) {
2344
- .close[data-v-8d67e1e0] {
2344
+ .close[data-v-ef5a672e] {
2345
2345
  inline-size: var(--ui-control-min-block-size);
2346
2346
  block-size: var(--ui-control-min-block-size);
2347
2347
  }
2348
2348
  }
2349
- html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-8d67e1e0] {
2349
+ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-ef5a672e] {
2350
2350
  inline-size: var(--ui-control-min-block-size);
2351
2351
  block-size: var(--ui-control-min-block-size);
2352
2352
  }
2353
- .body[data-v-8d67e1e0] {
2353
+ .body[data-v-ef5a672e] {
2354
2354
  flex: 1 1 auto;
2355
2355
  min-block-size: 0;
2356
2356
  overflow: auto;
@@ -2378,7 +2378,7 @@ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v
2378
2378
  -1px calc(100% - var(--_ui-scroll-fade-size)),
2379
2379
  calc(100% - var(--_ui-scroll-fade-size)) 100%;
2380
2380
  }
2381
- footer[data-v-8d67e1e0] {
2381
+ footer[data-v-ef5a672e] {
2382
2382
  display: flex;
2383
2383
  flex: none;
2384
2384
  flex-wrap: wrap;
@@ -2387,28 +2387,28 @@ footer[data-v-8d67e1e0] {
2387
2387
  padding: var(--ui-space-3) var(--ui-space-5);
2388
2388
  border-block-start: 1px solid var(--ui-border-default);
2389
2389
  }
2390
- footer[data-v-8d67e1e0]:empty {
2390
+ footer[data-v-ef5a672e]:empty {
2391
2391
  display: none;
2392
2392
  }
2393
- @keyframes ui-dialog-enter-8d67e1e0 {
2393
+ @keyframes ui-dialog-enter-ef5a672e {
2394
2394
  from {
2395
2395
  opacity: 0;
2396
2396
  transform: scale(0.96);
2397
2397
  }
2398
2398
  }
2399
- [data-component~="ui-dialog"][data-v-8d67e1e0]::backdrop {
2399
+ [data-component~="ui-dialog"][data-v-ef5a672e]::backdrop {
2400
2400
  background-color: transparent;
2401
2401
  transition:
2402
2402
  background-color var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
2403
2403
  display var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2404
2404
  overlay var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2405
2405
  }
2406
- [data-component~="ui-dialog"][open][data-v-8d67e1e0]::backdrop {
2406
+ [data-component~="ui-dialog"][open][data-v-ef5a672e]::backdrop {
2407
2407
  background-color: var(--ui-overlay-backdrop);
2408
- animation: ui-dialog-backdrop-enter-8d67e1e0 var(--_ui-dialog-duration, var(--ui-motion-base))
2408
+ animation: ui-dialog-backdrop-enter-ef5a672e var(--_ui-dialog-duration, var(--ui-motion-base))
2409
2409
  var(--ui-motion-ease);
2410
2410
  }
2411
- @keyframes ui-dialog-backdrop-enter-8d67e1e0 {
2411
+ @keyframes ui-dialog-backdrop-enter-ef5a672e {
2412
2412
  from {
2413
2413
  background-color: transparent;
2414
2414
  }