@threadlabs/looma 0.22.13 → 0.22.14

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.
Files changed (70) hide show
  1. package/components/shared/icons.js +4 -0
  2. package/components/ui-card/ui-card.html +21 -2
  3. package/components/ui-icon/ui-icon.html +4 -0
  4. package/components/ui-input/ui-input.html +1 -0
  5. package/components/ui-input-group/ui-input-group.html +11 -0
  6. package/components/ui-popover/ui-popover.html +15 -0
  7. package/components/ui-scroll-area/ui-scroll-area.html +12 -0
  8. package/components/ui-search-result-row/ui-search-result-row.html +11 -0
  9. package/components/ui-stack/ui-stack.html +6 -3
  10. package/components/ui-text/ui-text.html +12 -0
  11. package/dist/index.js +1 -1
  12. package/editor/chunks/extensions.js +55 -2
  13. package/editor/extensions/index.d.ts +1 -0
  14. package/editor/extensions/index.js +2 -2
  15. package/editor/extensions/preset.d.ts +2 -0
  16. package/editor/extensions/relative-links.d.ts +8 -0
  17. package/editor/icons.d.ts +4 -0
  18. package/editor/index.js +7 -3
  19. package/package.json +1 -1
  20. package/styles/ui-card.css +17 -0
  21. package/styles/ui-input-group.css +9 -0
  22. package/styles/ui-input.css +1 -0
  23. package/styles/ui-popover.css +13 -0
  24. package/styles/ui-scroll-area.css +10 -0
  25. package/styles/ui-search-result-row.css +9 -0
  26. package/styles/ui-stack.css +3 -0
  27. package/styles/ui-text.css +8 -0
  28. package/vanilla/UiCard.d.ts +2 -1
  29. package/vanilla/UiCard.js +1 -1
  30. package/vanilla/UiIcon.js +1 -1
  31. package/vanilla/UiInputGroup.d.ts +1 -0
  32. package/vanilla/UiInputGroup.js +1 -1
  33. package/vanilla/UiPopover.d.ts +1 -0
  34. package/vanilla/UiPopover.js +1 -1
  35. package/vanilla/UiScrollArea.d.ts +1 -0
  36. package/vanilla/UiScrollArea.js +1 -1
  37. package/vanilla/UiSearchResultRow.d.ts +1 -0
  38. package/vanilla/UiSearchResultRow.js +1 -1
  39. package/vanilla/UiStack.d.ts +1 -1
  40. package/vanilla/UiStack.js +1 -1
  41. package/vanilla/UiText.d.ts +2 -0
  42. package/vanilla/UiText.js +1 -1
  43. package/vue/UiCard.d.ts +12 -3
  44. package/vue/UiCard.vue +49 -5
  45. package/vue/UiIcon.vue +23 -0
  46. package/vue/UiInput.vue +1 -0
  47. package/vue/UiInputGroup.d.ts +9 -0
  48. package/vue/UiInputGroup.vue +33 -2
  49. package/vue/UiPopover.d.ts +9 -0
  50. package/vue/UiPopover.vue +43 -2
  51. package/vue/UiScrollArea.d.ts +9 -0
  52. package/vue/UiScrollArea.vue +35 -2
  53. package/vue/UiSearchResultRow.d.ts +9 -0
  54. package/vue/UiSearchResultRow.vue +38 -1
  55. package/vue/UiStack.d.ts +3 -3
  56. package/vue/UiStack.vue +10 -4
  57. package/vue/UiText.d.ts +18 -0
  58. package/vue/UiText.vue +70 -0
  59. package/vue/chunks/UiCard.js +39 -3
  60. package/vue/chunks/UiIcon.js +69 -1
  61. package/vue/chunks/UiInput.js +1 -1
  62. package/vue/chunks/UiInputGroup.js +59 -22
  63. package/vue/chunks/UiPopover.js +37 -5
  64. package/vue/chunks/UiScrollArea.js +66 -23
  65. package/vue/chunks/UiSearchResultRow.js +28 -2
  66. package/vue/chunks/UiStack.js +3 -2
  67. package/vue/chunks/UiText.js +92 -4
  68. package/vue/components.css +174 -301
  69. package/vue/editor/LoomaEditor.d.ts +11 -0
  70. package/vue/editor/index.js +261 -145
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-popover/ui-popover.js";
4
4
  import "../styles/ui-popover.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-popover","props":{"for":{"type":"string","required":false,"target":{"attribute":"for"},"default":""},"open":{"type":"boolean","required":false,"target":{"attribute":"open"},"default":false},"placement":{"type":{"kind":"terminal","name":"keyword"},"values":["top","top-start","top-end","bottom","bottom-start","bottom-end","left","left-start","left-end","right","right-start","right-end"],"required":false,"target":{"attribute":"placement"},"default":"bottom-start"}}},"template":{"kind":"element","name":"span","attributes":[],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"surface"}],"children":[{"kind":"slot"}]}]},"declarations":[{"kind":"state","name":"internalOpen","type":"boolean","value":"false","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"open","type":"object","shape":{"kind":"object","fields":[{"name":"open","type":{"kind":"terminal","name":"boolean"},"optional":false},{"name":"reason","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["action","programmatic","light-dismiss","escape"]},"optional":false},{"name":"trigger","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["keyboard","pointer","programmatic"]},"optional":false}],"open":false},"bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"close","type":"object","shape":{"kind":"object","fields":[{"name":"open","type":{"kind":"terminal","name":"boolean"},"optional":false},{"name":"reason","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["action","programmatic","light-dismiss","escape"]},"optional":false},{"name":"trigger","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["keyboard","pointer","programmatic"]},"optional":false}],"open":false},"bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"span","choices":["span"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-popover","props":{"for":{"type":"string","required":false,"target":{"attribute":"for"},"default":""},"open":{"type":"boolean","required":false,"target":{"attribute":"open"},"default":false},"placement":{"type":{"kind":"terminal","name":"keyword"},"values":["top","top-start","top-end","bottom","bottom-start","bottom-end","left","left-start","left-end","right","right-start","right-end"],"required":false,"target":{"attribute":"placement"},"default":"bottom-start"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["content","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"content"}}},"template":{"kind":"element","name":"span","attributes":[],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"surface"}],"children":[{"kind":"slot"}]}]},"declarations":[{"kind":"state","name":"internalOpen","type":"boolean","value":"false","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"open","type":"object","shape":{"kind":"object","fields":[{"name":"open","type":{"kind":"terminal","name":"boolean"},"optional":false},{"name":"reason","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["action","programmatic","light-dismiss","escape"]},"optional":false},{"name":"trigger","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["keyboard","pointer","programmatic"]},"optional":false}],"open":false},"bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"close","type":"object","shape":{"kind":"object","fields":[{"name":"open","type":{"kind":"terminal","name":"boolean"},"optional":false},{"name":"reason","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["action","programmatic","light-dismiss","escape"]},"optional":false},{"name":"trigger","type":{"kind":"constrained","base":{"kind":"terminal","name":"keyword"},"values":["keyboard","pointer","programmatic"]},"optional":false}],"open":false},"bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"span","choices":["span"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiPopover(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -7,6 +7,7 @@ export interface UiScrollAreaElement extends HTMLDivElement {
7
7
  }
8
8
  export interface UiScrollAreaProps {
9
9
  orientation?: "vertical" | "horizontal" | null;
10
+ size?: "content" | "sm" | "md" | "lg" | null;
10
11
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
11
12
  children?: readonly (string | Node)[];
12
13
  slots?: Readonly<Record<string, readonly (string | Node)[]>>;
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-scroll-area/ui-scroll-area.js";
4
4
  import "../styles/ui-scroll-area.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-scroll-area","props":{"orientation":{"type":{"kind":"terminal","name":"keyword"},"values":["vertical","horizontal"],"required":false,"target":{"attribute":"orientation"},"default":"vertical"}}},"template":{"kind":"element","name":"div","attributes":[],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"slot"}],"ref":"content"}]},"declarations":[],"root":{"kind":"native","element":"div","choices":["div"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-scroll-area","props":{"orientation":{"type":{"kind":"terminal","name":"keyword"},"values":["vertical","horizontal"],"required":false,"target":{"attribute":"orientation"},"default":"vertical"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["content","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"content"}}},"template":{"kind":"element","name":"div","attributes":[],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"slot"}],"ref":"content"}]},"declarations":[],"root":{"kind":"native","element":"div","choices":["div"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiScrollArea(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -6,6 +6,7 @@ export interface UiSearchResultRowElement extends HTMLButtonElement {
6
6
  removeEventListener<K extends keyof UiSearchResultRowEventMap>(type: K, listener: (this: UiSearchResultRowElement, event: UiSearchResultRowEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
7
7
  }
8
8
  export interface UiSearchResultRowProps {
9
+ density?: "comfortable" | "compact" | null;
9
10
  disabled?: boolean | null;
10
11
  selected?: boolean | null;
11
12
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
@@ -2,7 +2,7 @@
2
2
  import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import "../styles/ui-search-result-row.css";
4
4
 
5
- const definition = {...{"contract":{"tag":"ui-search-result-row","props":{"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"aria-current"},"default":false}}},"template":{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"aria-current","expression":"selected","expressionPlan":{"source":"selected","ast":{"kind":"id","name":"selected"},"dependencies":["selected"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"title"}],"children":[{"kind":"slot","fallback":[],"name":"title"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"meta"}],"children":[{"kind":"slot","fallback":[],"name":"meta"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"excerpt"}],"children":[{"kind":"slot","fallback":[],"name":"excerpt"}]}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"trailing"}],"children":[{"kind":"slot","fallback":[],"name":"trailing"}]}]},"declarations":[],"root":{"kind":"native","element":"button","choices":["button"]}},source:{file:import.meta.url},css:""};
5
+ const definition = {...{"contract":{"tag":"ui-search-result-row","props":{"density":{"type":{"kind":"terminal","name":"keyword"},"values":["comfortable","compact"],"required":false,"target":{"attribute":"density"},"default":"comfortable"},"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"aria-current"},"default":false}}},"template":{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"aria-current","expression":"selected","expressionPlan":{"source":"selected","ast":{"kind":"id","name":"selected"},"dependencies":["selected"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"title"}],"children":[{"kind":"slot","fallback":[],"name":"title"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"meta"}],"children":[{"kind":"slot","fallback":[],"name":"meta"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"excerpt"}],"children":[{"kind":"slot","fallback":[],"name":"excerpt"}]}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"trailing"}],"children":[{"kind":"slot","fallback":[],"name":"trailing"}]}]},"declarations":[],"root":{"kind":"native","element":"button","choices":["button"]}},source:{file:import.meta.url},css:""};
6
6
 
7
7
  export function createUiSearchResultRow(options = {}) {
8
8
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -7,7 +7,7 @@ export interface UiStackElement extends HTMLDivElement {
7
7
  }
8
8
  export interface UiStackProps {
9
9
  align?: "start" | "center" | "end" | "stretch" | null;
10
- gap?: "xs" | "s" | "m" | "l" | "xl" | null;
10
+ gap?: "none" | "xs" | "s" | "m" | "l" | "xl" | null;
11
11
  justify?: "start" | "center" | "end" | "between" | null;
12
12
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
13
13
  children?: readonly (string | Node)[];
@@ -25,7 +25,7 @@ export function createUiStack(options = {}) {
25
25
  }
26
26
  manageGeneratedProps(element, [
27
27
  { name: "align", attribute: "data-align", value: componentProps["align"], type: ["start","center","end","stretch"], required: false },
28
- { name: "gap", attribute: "data-gap", value: componentProps["gap"], type: ["xs","s","m","l","xl"], required: false },
28
+ { name: "gap", attribute: "data-gap", value: componentProps["gap"], type: ["none","xs","s","m","l","xl"], required: false },
29
29
  { name: "justify", attribute: "data-justify", value: componentProps["justify"], type: ["start","center","end","between"], required: false },
30
30
  ]);
31
31
  return element;
@@ -8,11 +8,13 @@ export interface UiTextElement extends HTMLElement {
8
8
  export interface UiTextProps {
9
9
  align?: "start" | "center" | null;
10
10
  as?: "p" | "span" | "div" | "small" | "strong" | "label" | "h2" | "h3" | "h4" | "h5" | "h6" | null;
11
+ font?: "inherit" | "sans" | null;
11
12
  size?: "inherit" | "xs" | "sm" | "md" | "lg" | null;
12
13
  tone?: "default" | "secondary" | "muted" | "accent" | "danger" | "success" | "info" | "warning" | null;
13
14
  truncate?: boolean | null;
14
15
  variant?: "body" | "eyebrow" | "code" | null;
15
16
  weight?: "inherit" | "normal" | "medium" | "semibold" | null;
17
+ wrap?: "normal" | "anywhere" | null;
16
18
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
17
19
  children?: readonly (string | Node)[];
18
20
  slots?: Readonly<Record<string, readonly (string | Node)[]>>;
package/vanilla/UiText.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { componentRootIndex, manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import "../styles/ui-text.css";
4
4
 
5
- const definition = {...{"contract":{"tag":"ui-text","props":{"align":{"type":{"kind":"terminal","name":"keyword"},"values":["start","center"],"required":false,"target":{"attribute":"align"},"default":"start"},"as":{"type":{"kind":"terminal","name":"keyword"},"values":["p","span","div","small","strong","label","h2","h3","h4","h5","h6"],"required":false,"target":{"attribute":"as"},"default":"p"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["inherit","xs","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"inherit"},"tone":{"type":{"kind":"terminal","name":"keyword"},"values":["default","secondary","muted","accent","danger","success","info","warning"],"required":false,"target":{"attribute":"tone"},"default":"default"},"truncate":{"type":"boolean","required":false,"target":{"attribute":"truncate"},"default":false},"variant":{"type":{"kind":"terminal","name":"keyword"},"values":["body","eyebrow","code"],"required":false,"target":{"attribute":"variant"},"default":"body"},"weight":{"type":{"kind":"terminal","name":"keyword"},"values":["inherit","normal","medium","semibold"],"required":false,"target":{"attribute":"weight"},"default":"inherit"}}},"template":{"kind":"element","name":"template","attributes":[],"children":[{"kind":"element","name":"span","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'span'","testPlan":{"source":"as = 'span'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"span"}},"dependencies":["as"]}}},{"kind":"element","name":"div","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'div'","testPlan":{"source":"as = 'div'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"div"}},"dependencies":["as"]}}},{"kind":"element","name":"small","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'small'","testPlan":{"source":"as = 'small'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"small"}},"dependencies":["as"]}}},{"kind":"element","name":"strong","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'strong'","testPlan":{"source":"as = 'strong'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"strong"}},"dependencies":["as"]}}},{"kind":"element","name":"label","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'label'","testPlan":{"source":"as = 'label'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"label"}},"dependencies":["as"]}}},{"kind":"element","name":"h2","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h2'","testPlan":{"source":"as = 'h2'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h2"}},"dependencies":["as"]}}},{"kind":"element","name":"h3","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h3'","testPlan":{"source":"as = 'h3'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h3"}},"dependencies":["as"]}}},{"kind":"element","name":"h4","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h4'","testPlan":{"source":"as = 'h4'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h4"}},"dependencies":["as"]}}},{"kind":"element","name":"h5","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h5'","testPlan":{"source":"as = 'h5'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h5"}},"dependencies":["as"]}}},{"kind":"element","name":"h6","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h6'","testPlan":{"source":"as = 'h6'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h6"}},"dependencies":["as"]}}},{"kind":"element","name":"p","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"else"}}],"flow":{"kind":"match"}},"declarations":[],"root":{"kind":"native","element":"p","choices":["span","div","small","strong","label","h2","h3","h4","h5","h6","p"]}},source:{file:import.meta.url},css:""};
5
+ const definition = {...{"contract":{"tag":"ui-text","props":{"align":{"type":{"kind":"terminal","name":"keyword"},"values":["start","center"],"required":false,"target":{"attribute":"align"},"default":"start"},"as":{"type":{"kind":"terminal","name":"keyword"},"values":["p","span","div","small","strong","label","h2","h3","h4","h5","h6"],"required":false,"target":{"attribute":"as"},"default":"p"},"font":{"type":{"kind":"terminal","name":"keyword"},"values":["inherit","sans"],"required":false,"target":{"attribute":"font"},"default":"inherit"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["inherit","xs","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"inherit"},"tone":{"type":{"kind":"terminal","name":"keyword"},"values":["default","secondary","muted","accent","danger","success","info","warning"],"required":false,"target":{"attribute":"tone"},"default":"default"},"truncate":{"type":"boolean","required":false,"target":{"attribute":"truncate"},"default":false},"variant":{"type":{"kind":"terminal","name":"keyword"},"values":["body","eyebrow","code"],"required":false,"target":{"attribute":"variant"},"default":"body"},"weight":{"type":{"kind":"terminal","name":"keyword"},"values":["inherit","normal","medium","semibold"],"required":false,"target":{"attribute":"weight"},"default":"inherit"},"wrap":{"type":{"kind":"terminal","name":"keyword"},"values":["normal","anywhere"],"required":false,"target":{"attribute":"wrap"},"default":"normal"}}},"template":{"kind":"element","name":"template","attributes":[],"children":[{"kind":"element","name":"span","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'span'","testPlan":{"source":"as = 'span'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"span"}},"dependencies":["as"]}}},{"kind":"element","name":"div","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'div'","testPlan":{"source":"as = 'div'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"div"}},"dependencies":["as"]}}},{"kind":"element","name":"small","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'small'","testPlan":{"source":"as = 'small'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"small"}},"dependencies":["as"]}}},{"kind":"element","name":"strong","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'strong'","testPlan":{"source":"as = 'strong'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"strong"}},"dependencies":["as"]}}},{"kind":"element","name":"label","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'label'","testPlan":{"source":"as = 'label'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"label"}},"dependencies":["as"]}}},{"kind":"element","name":"h2","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h2'","testPlan":{"source":"as = 'h2'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h2"}},"dependencies":["as"]}}},{"kind":"element","name":"h3","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h3'","testPlan":{"source":"as = 'h3'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h3"}},"dependencies":["as"]}}},{"kind":"element","name":"h4","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h4'","testPlan":{"source":"as = 'h4'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h4"}},"dependencies":["as"]}}},{"kind":"element","name":"h5","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h5'","testPlan":{"source":"as = 'h5'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h5"}},"dependencies":["as"]}}},{"kind":"element","name":"h6","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'h6'","testPlan":{"source":"as = 'h6'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"h6"}},"dependencies":["as"]}}},{"kind":"element","name":"p","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"else"}}],"flow":{"kind":"match"}},"declarations":[],"root":{"kind":"native","element":"p","choices":["span","div","small","strong","label","h2","h3","h4","h5","h6","p"]}},source:{file:import.meta.url},css:""};
6
6
 
7
7
  export function createUiText(options = {}) {
8
8
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
package/vue/UiCard.d.ts CHANGED
@@ -15,7 +15,11 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
15
15
  default: string;
16
16
  };
17
17
  padding: {
18
- type: PropType<"sm" | "md" | "lg" | null>;
18
+ type: PropType<"xs" | "sm" | "md" | "lg" | null>;
19
+ default: string;
20
+ };
21
+ size: {
22
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
19
23
  default: string;
20
24
  };
21
25
  tone: {
@@ -32,7 +36,11 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
32
36
  default: string;
33
37
  };
34
38
  padding: {
35
- type: PropType<"sm" | "md" | "lg" | null>;
39
+ type: PropType<"xs" | "sm" | "md" | "lg" | null>;
40
+ default: string;
41
+ };
42
+ size: {
43
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
36
44
  default: string;
37
45
  };
38
46
  tone: {
@@ -44,10 +52,11 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
44
52
  default: string;
45
53
  };
46
54
  }>> & Readonly<{}>, {
55
+ size: "sm" | "md" | "content" | "lg" | null;
47
56
  tone: "neutral" | "danger" | null;
48
57
  variant: "subtle" | "outlined" | "elevated" | null;
49
58
  as: "div" | "article" | "aside" | "section" | null;
50
- padding: "sm" | "md" | "lg" | null;
59
+ padding: "xs" | "sm" | "md" | "lg" | null;
51
60
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
52
61
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
53
62
  declare const _default: typeof __VLS_export;
package/vue/UiCard.vue CHANGED
@@ -23,10 +23,19 @@ const propValidityContract = {
23
23
  required: false,
24
24
  target: { attribute: 'padding' },
25
25
  description:
26
- 'The space inside the card: sm is snug (0.75rem), md is the default (1.5rem), and lg is roomy (2rem).',
27
- values: ['sm', 'md', 'lg'],
26
+ 'The space inside the card: xs is compact (0.5rem), sm is snug (0.75rem), md is the default (1.5rem), and lg is roomy (2rem).',
27
+ values: ['xs', 'sm', 'md', 'lg'],
28
28
  default: 'md',
29
29
  },
30
+ size: {
31
+ type: { kind: 'terminal', name: 'keyword' },
32
+ required: false,
33
+ target: { attribute: 'size' },
34
+ description:
35
+ 'Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.',
36
+ values: ['content', 'sm', 'md', 'lg'],
37
+ default: 'content',
38
+ },
30
39
  tone: {
31
40
  type: { kind: 'terminal', name: 'keyword' },
32
41
  required: false,
@@ -52,7 +61,11 @@ const props = defineProps({
52
61
  type: null as unknown as PropType<'div' | 'section' | 'article' | 'aside' | null>,
53
62
  default: 'div',
54
63
  },
55
- padding: { type: null as unknown as PropType<'sm' | 'md' | 'lg' | null>, default: 'md' },
64
+ padding: { type: null as unknown as PropType<'xs' | 'sm' | 'md' | 'lg' | null>, default: 'md' },
65
+ size: {
66
+ type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
67
+ default: 'content',
68
+ },
56
69
  tone: { type: null as unknown as PropType<'neutral' | 'danger' | null>, default: 'neutral' },
57
70
  variant: {
58
71
  type: null as unknown as PropType<'outlined' | 'subtle' | 'elevated' | null>,
@@ -62,6 +75,7 @@ const props = defineProps({
62
75
  const acceptedProps: Record<string, unknown> = {
63
76
  as: 'div',
64
77
  padding: 'md',
78
+ size: 'content',
65
79
  tone: 'neutral',
66
80
  variant: 'outlined',
67
81
  }
@@ -73,13 +87,20 @@ const checkedProps = computed(() => ({
73
87
  'as',
74
88
  acceptedProps,
75
89
  ) as 'div' | 'section' | 'article' | 'aside',
76
- padding: checkedProp<'sm' | 'md' | 'lg'>(
90
+ padding: checkedProp<'xs' | 'sm' | 'md' | 'lg'>(
77
91
  props['padding'],
78
92
  { kind: 'terminal', name: 'keyword' },
79
93
  false,
80
94
  'padding',
81
95
  acceptedProps,
82
- ) as 'sm' | 'md' | 'lg',
96
+ ) as 'xs' | 'sm' | 'md' | 'lg',
97
+ size: checkedProp<'content' | 'sm' | 'md' | 'lg'>(
98
+ props['size'],
99
+ { kind: 'terminal', name: 'keyword' },
100
+ false,
101
+ 'size',
102
+ acceptedProps,
103
+ ) as 'content' | 'sm' | 'md' | 'lg',
83
104
  tone: checkedProp<'neutral' | 'danger'>(
84
105
  props['tone'],
85
106
  { kind: 'terminal', name: 'keyword' },
@@ -166,6 +187,8 @@ const hostState = computed(() =>
166
187
  && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
167
188
  checkedProps.value.tone && 'tone',
168
189
  checkedProps.value.tone != null && `tone=${encodeURIComponent(checkedProps.value.tone)}`,
190
+ checkedProps.value.size && 'size',
191
+ checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
169
192
  ].filter(Boolean).join(' ')
170
193
  )
171
194
  </script>
@@ -178,6 +201,7 @@ const hostState = computed(() =>
178
201
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
179
202
  :data-as="reflectedProp('as', 'as', checkedProps.as, undefined, false)"
180
203
  :data-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
204
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
181
205
  :data-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
182
206
  :data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
183
207
  :data-ui-card-state="hostState || undefined"
@@ -192,6 +216,7 @@ const hostState = computed(() =>
192
216
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
193
217
  :data-as="reflectedProp('as', 'as', checkedProps.as, undefined, false)"
194
218
  :data-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
219
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
195
220
  :data-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
196
221
  :data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
197
222
  :data-ui-card-state="hostState || undefined"
@@ -206,6 +231,7 @@ const hostState = computed(() =>
206
231
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
207
232
  :data-as="reflectedProp('as', 'as', checkedProps.as, undefined, false)"
208
233
  :data-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
234
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
209
235
  :data-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
210
236
  :data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
211
237
  :data-ui-card-state="hostState || undefined"
@@ -220,6 +246,7 @@ const hostState = computed(() =>
220
246
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
221
247
  :data-as="reflectedProp('as', 'as', checkedProps.as, undefined, false)"
222
248
  :data-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
249
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
223
250
  :data-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
224
251
  :data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
225
252
  :data-ui-card-state="hostState || undefined"
@@ -245,6 +272,10 @@ const hostState = computed(() =>
245
272
  color: var(--ui-text-primary);
246
273
  }
247
274
 
275
+ [data-component~="ui-card"][data-ui-card-state~="padding=xs"] {
276
+ gap: var(--ui-space-1);
277
+ padding: var(--ui-space-2);
278
+ }
248
279
  [data-component~="ui-card"][data-ui-card-state~="padding=sm"] {
249
280
  gap: var(--ui-space-2);
250
281
  padding: var(--ui-space-3);
@@ -270,6 +301,19 @@ const hostState = computed(() =>
270
301
  background: var(--ui-danger-soft);
271
302
  }
272
303
 
304
+ [data-component~="ui-card"][data-ui-card-state~="size=sm"] {
305
+ inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
306
+ max-inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
307
+ }
308
+ [data-component~="ui-card"][data-ui-card-state~="size=md"] {
309
+ inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
310
+ max-inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
311
+ }
312
+ [data-component~="ui-card"][data-ui-card-state~="size=lg"] {
313
+ inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
314
+ max-inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
315
+ }
316
+
273
317
  /* A component that sets its display still honours the hidden attribute on its root. */
274
318
  [data-component~="ui-card"][hidden] {
275
319
  display: none;
package/vue/UiIcon.vue CHANGED
@@ -177,6 +177,10 @@ const shapes = cycleCheckedComputed(() =>
177
177
  tag: 'path',
178
178
  d: 'M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21',
179
179
  }, { tag: 'path', d: 'm5.082 11.09 8.828 8.828' }],
180
+ 'external-link': [{ tag: 'path', d: 'M15 3h6v6' }, { tag: 'path', d: 'M10 14 21 3' }, {
181
+ tag: 'path',
182
+ d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6',
183
+ }],
180
184
  'file-text': [
181
185
  {
182
186
  tag: 'path',
@@ -319,6 +323,10 @@ const shapes = cycleCheckedComputed(() =>
319
323
  tag: 'path',
320
324
  d: 'M3 9h18',
321
325
  }],
326
+ pencil: [{
327
+ tag: 'path',
328
+ d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',
329
+ }, { tag: 'path', d: 'm15 5 4 4' }],
322
330
  pilcrow: [{ tag: 'path', d: 'M13 4v16' }, { tag: 'path', d: 'M17 4v16' }, {
323
331
  tag: 'path',
324
332
  d: 'M19 4H9.5a4.5 4.5 0 0 0 0 9H13',
@@ -344,6 +352,7 @@ const shapes = cycleCheckedComputed(() =>
344
352
  tag: 'path',
345
353
  d: 'M21 9H3',
346
354
  }, { tag: 'path', d: 'M21 15H3' }],
355
+ search: [{ tag: 'path', d: 'm21 21-4.34-4.34' }, { tag: 'circle', cx: '11', cy: '11', r: '8' }],
347
356
  settings: [{
348
357
  tag: 'path',
349
358
  d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',
@@ -400,6 +409,20 @@ const shapes = cycleCheckedComputed(() =>
400
409
  tag: 'path',
401
410
  d: 'M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11',
402
411
  }],
412
+ unlink: [
413
+ {
414
+ tag: 'path',
415
+ d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71',
416
+ },
417
+ {
418
+ tag: 'path',
419
+ d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71',
420
+ },
421
+ { tag: 'line', x1: '8', x2: '8', y1: '2', y2: '5' },
422
+ { tag: 'line', x1: '2', x2: '5', y1: '8', y2: '8' },
423
+ { tag: 'line', x1: '16', x2: '16', y1: '19', y2: '22' },
424
+ { tag: 'line', x1: '19', x2: '22', y1: '16', y2: '16' },
425
+ ],
403
426
  'user-round': [{ tag: 'circle', cx: '12', cy: '8', r: '5' }, {
404
427
  tag: 'path',
405
428
  d: 'M20 21a8 8 0 0 0-16 0',
package/vue/UiInput.vue CHANGED
@@ -553,6 +553,7 @@ useComponentHost(() => import('../components/ui-input/ui-input.js'), {
553
553
  margin: 0;
554
554
  padding: var(--ui-space-2) var(--ui-space-3);
555
555
  appearance: none;
556
+ padding-inline-start: var(--_ui-default-input-padding-inline-start, var(--ui-space-3));
556
557
  border: var(--ui-input-border-width, var(--_ui-default-input-border-width, 1px)) solid
557
558
  var(
558
559
  --ui-input-border,
@@ -14,13 +14,22 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
14
14
  type: PropType<boolean | null>;
15
15
  default: boolean;
16
16
  };
17
+ prefixKind: {
18
+ type: PropType<"text" | "icon" | null>;
19
+ default: string;
20
+ };
17
21
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
18
22
  disabled: {
19
23
  type: PropType<boolean | null>;
20
24
  default: boolean;
21
25
  };
26
+ prefixKind: {
27
+ type: PropType<"text" | "icon" | null>;
28
+ default: string;
29
+ };
22
30
  }>> & Readonly<{}>, {
23
31
  disabled: boolean | null;
32
+ prefixKind: "text" | "icon" | null;
24
33
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
25
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
26
35
  declare const _default: typeof __VLS_export;
@@ -17,12 +17,22 @@ const propValidityContract = {
17
17
  'Fades the group\'s framing to match a disabled input inside it. Disable the input itself too.',
18
18
  default: false,
19
19
  },
20
+ prefixKind: {
21
+ type: { kind: 'terminal', name: 'keyword' },
22
+ required: false,
23
+ target: { attribute: 'prefixkind' },
24
+ description:
25
+ 'Text affixes have their own framing. An icon prefix shares the field surface and uses one compact icon-to-value gap.',
26
+ values: ['text', 'icon'],
27
+ default: 'text',
28
+ },
20
29
  },
21
30
  } as const
22
31
  const props = defineProps({
23
32
  disabled: { type: null as unknown as PropType<boolean | null>, default: false },
33
+ prefixKind: { type: null as unknown as PropType<'text' | 'icon' | null>, default: 'text' },
24
34
  })
25
- const acceptedProps: Record<string, unknown> = { disabled: false }
35
+ const acceptedProps: Record<string, unknown> = { disabled: false, prefixKind: 'text' }
26
36
  const checkedProps = computed(() => ({
27
37
  disabled: checkedProp<boolean>(
28
38
  props['disabled'],
@@ -31,6 +41,13 @@ const checkedProps = computed(() => ({
31
41
  'disabled',
32
42
  acceptedProps,
33
43
  ) as boolean,
44
+ prefixKind: checkedProp<'text' | 'icon'>(
45
+ props['prefixKind'],
46
+ { kind: 'terminal', name: 'keyword' },
47
+ false,
48
+ 'prefixKind',
49
+ acceptedProps,
50
+ ) as 'text' | 'icon',
34
51
  }))
35
52
  void checkedProps.value
36
53
  watchSyncEffect(() => {
@@ -92,6 +109,9 @@ if (
92
109
  const hostState = computed(() =>
93
110
  [
94
111
  checkedProps.value.disabled && 'disabled',
112
+ checkedProps.value.prefixKind && 'prefixKind',
113
+ checkedProps.value.prefixKind != null
114
+ && `prefixKind=${encodeURIComponent(checkedProps.value.prefixKind)}`,
95
115
  ].filter(Boolean).join(' ')
96
116
  )
97
117
 
@@ -112,7 +132,7 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
112
132
  ? (incoming[name] ?? incoming[kebab] ?? null)
113
133
  : null
114
134
  },
115
- propNames: ['disabled'],
135
+ propNames: ['disabled', 'prefixKind'],
116
136
  propValidity: (name: string) =>
117
137
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
118
138
  })
@@ -124,6 +144,7 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
124
144
  v-bind="nativeAttrs($attrs)"
125
145
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
126
146
  :data-disabled="reflectedProp('disabled', 'disabled', checkedProps.disabled, undefined, false)"
147
+ :data-prefix-kind="reflectedProp('prefixKind', 'prefix-kind', checkedProps.prefixKind, undefined, false)"
127
148
  :data-ui-input-group-state="hostState || undefined"
128
149
  ref="root"
129
150
  >
@@ -283,6 +304,16 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
283
304
  border-inline-start: 1px solid var(--ui-border-divider);
284
305
  }
285
306
 
307
+ [data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"] {
308
+ --_ui-default-input-padding-inline-start: var(--ui-space-2);
309
+ }
310
+ [data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"]
311
+ .affix:first-child {
312
+ padding-inline-end: 0;
313
+ border-inline-end: 0;
314
+ background: transparent;
315
+ }
316
+
286
317
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
287
318
  small button sits inside it with the difference split evenly, and the field keeps its height. */
288
319
  .action {
@@ -16,6 +16,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
16
16
  type: PropType<"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end" | null>;
17
17
  default: string;
18
18
  };
19
+ size: {
20
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
21
+ default: string;
22
+ };
19
23
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
20
24
  open: (event: CustomEvent<{
21
25
  readonly open: boolean;
@@ -41,6 +45,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
41
45
  type: PropType<"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end" | null>;
42
46
  default: string;
43
47
  };
48
+ size: {
49
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
50
+ default: string;
51
+ };
44
52
  }>> & Readonly<{
45
53
  onOpen?: ((event: CustomEvent<{
46
54
  readonly open: boolean;
@@ -55,6 +63,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
55
63
  }>) => any) | undefined;
56
64
  }>, {
57
65
  open: boolean | null;
66
+ size: "sm" | "md" | "content" | "lg" | null;
58
67
  for: string | null;
59
68
  placement: "left" | "right" | "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left-start" | "left-end" | "right-start" | "right-end" | null;
60
69
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
package/vue/UiPopover.vue CHANGED
@@ -45,6 +45,15 @@ const propValidityContract = {
45
45
  ],
46
46
  default: 'bottom-start',
47
47
  },
48
+ size: {
49
+ type: { kind: 'terminal', name: 'keyword' },
50
+ required: false,
51
+ target: { attribute: 'size' },
52
+ description:
53
+ 'Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.',
54
+ values: ['content', 'sm', 'md', 'lg'],
55
+ default: 'content',
56
+ },
48
57
  },
49
58
  } as const
50
59
  const props = defineProps({
@@ -68,8 +77,17 @@ const props = defineProps({
68
77
  >,
69
78
  default: 'bottom-start',
70
79
  },
80
+ size: {
81
+ type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
82
+ default: 'content',
83
+ },
71
84
  })
72
- const acceptedProps: Record<string, unknown> = { for: '', open: false, placement: 'bottom-start' }
85
+ const acceptedProps: Record<string, unknown> = {
86
+ for: '',
87
+ open: false,
88
+ placement: 'bottom-start',
89
+ size: 'content',
90
+ }
73
91
  const checkedProps = computed(() => ({
74
92
  for: checkedProp<string>(
75
93
  props['for'],
@@ -111,6 +129,13 @@ const checkedProps = computed(() => ({
111
129
  | 'right'
112
130
  | 'right-start'
113
131
  | 'right-end',
132
+ size: checkedProp<'content' | 'sm' | 'md' | 'lg'>(
133
+ props['size'],
134
+ { kind: 'terminal', name: 'keyword' },
135
+ false,
136
+ 'size',
137
+ acceptedProps,
138
+ ) as 'content' | 'sm' | 'md' | 'lg',
114
139
  }))
115
140
  void checkedProps.value
116
141
  watchSyncEffect(() => {
@@ -195,6 +220,8 @@ if (
195
220
  const hostState = computed(() =>
196
221
  [
197
222
  internalOpen.value && 'internalOpen',
223
+ checkedProps.value.size && 'size',
224
+ checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
198
225
  ].filter(Boolean).join(' ')
199
226
  )
200
227
 
@@ -232,7 +259,7 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
232
259
  ? (incoming[name] ?? incoming[kebab] ?? null)
233
260
  : null
234
261
  },
235
- propNames: ['for', 'open', 'placement'],
262
+ propNames: ['for', 'open', 'placement', 'size'],
236
263
  propValidity: (name: string) =>
237
264
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
238
265
  state: { internalOpen },
@@ -247,6 +274,7 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
247
274
  :data-for="reflectedProp('for', 'for', checkedProps.for, undefined, false)"
248
275
  :data-open="reflectedProp('open', 'open', checkedProps.open, undefined, false)"
249
276
  :data-placement="reflectedProp('placement', 'placement', checkedProps.placement, undefined, false)"
277
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
250
278
  :data-ui-popover-state="hostState || undefined"
251
279
  ref="root"
252
280
  ><div class="surface"><slot /></div></span>
@@ -348,6 +376,19 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
348
376
  }
349
377
  }
350
378
 
379
+ [data-component~="ui-popover"][data-ui-popover-state~="size=sm"] {
380
+ inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
381
+ max-inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
382
+ }
383
+ [data-component~="ui-popover"][data-ui-popover-state~="size=md"] {
384
+ inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
385
+ max-inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
386
+ }
387
+ [data-component~="ui-popover"][data-ui-popover-state~="size=lg"] {
388
+ inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
389
+ max-inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
390
+ }
391
+
351
392
  [data-component~="ui-popover"][hidden] {
352
393
  display: none;
353
394
  }