@threadlabs/looma 0.25.4 → 0.25.5

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 (58) hide show
  1. package/components/ui-card/ui-card.html +27 -2
  2. package/components/ui-cluster/ui-cluster.html +30 -0
  3. package/components/ui-editor-surface/ui-editor-surface.html +23 -0
  4. package/components/ui-scroll-area/ui-scroll-area.html +5 -0
  5. package/components/ui-stack/ui-stack.html +17 -1
  6. package/components/ui-text/ui-text.html +5 -0
  7. package/components/ui-textarea/ui-textarea.html +7 -0
  8. package/dist/index.js +1 -1
  9. package/package.json +1 -1
  10. package/styles/ui-card.css +24 -0
  11. package/styles/ui-cluster.css +25 -0
  12. package/styles/ui-editor-surface.css +19 -0
  13. package/styles/ui-scroll-area.css +4 -0
  14. package/styles/ui-stack.css +13 -0
  15. package/styles/ui-text.css +4 -0
  16. package/styles/ui-textarea.css +4 -0
  17. package/vanilla/UiCard.d.ts +1 -1
  18. package/vanilla/UiCard.js +1 -1
  19. package/vanilla/UiCluster.d.ts +3 -0
  20. package/vanilla/UiCluster.js +9 -3
  21. package/vanilla/UiEditorSurface.d.ts +14 -0
  22. package/vanilla/UiEditorSurface.js +27 -0
  23. package/vanilla/UiScrollArea.d.ts +1 -0
  24. package/vanilla/UiScrollArea.js +1 -1
  25. package/vanilla/UiStack.d.ts +2 -0
  26. package/vanilla/UiStack.js +8 -9
  27. package/vanilla/UiText.d.ts +1 -0
  28. package/vanilla/UiText.js +1 -1
  29. package/vanilla/UiTextarea.d.ts +1 -0
  30. package/vanilla/UiTextarea.js +4 -1
  31. package/vanilla/index.js +1 -0
  32. package/vue/UiCard.d.ts +3 -3
  33. package/vue/UiCard.vue +34 -5
  34. package/vue/UiCluster.d.ts +27 -0
  35. package/vue/UiCluster.vue +95 -1
  36. package/vue/UiEditorSurface.d.ts +26 -0
  37. package/vue/UiEditorSurface.js +2 -0
  38. package/vue/UiEditorSurface.vue +129 -0
  39. package/vue/UiScrollArea.d.ts +9 -0
  40. package/vue/UiScrollArea.vue +28 -2
  41. package/vue/UiStack.d.ts +18 -0
  42. package/vue/UiStack.vue +58 -1
  43. package/vue/UiText.d.ts +9 -0
  44. package/vue/UiText.vue +33 -0
  45. package/vue/UiTextarea.d.ts +9 -0
  46. package/vue/UiTextarea.vue +37 -2
  47. package/vue/chunks/UiCard.js +10 -3
  48. package/vue/chunks/UiCluster.js +82 -1
  49. package/vue/chunks/UiEditorSurface.js +71 -0
  50. package/vue/chunks/UiScrollArea.js +28 -2
  51. package/vue/chunks/UiStack.js +46 -1
  52. package/vue/chunks/UiText.js +43 -1
  53. package/vue/chunks/UiTextarea.js +28 -2
  54. package/vue/components.css +188 -104
  55. package/vue/editor/LoomaEditor.d.ts +12 -0
  56. package/vue/editor/index.js +7 -2
  57. package/vue/index.d.ts +1 -0
  58. package/vue/index.js +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.25.4",
3
+ "version": "0.25.5",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -38,6 +38,30 @@
38
38
  box-shadow: var(--ui-shadow-lg);
39
39
  }
40
40
 
41
+ :scope[data-ui-card-state~="tone=accent"] {
42
+ border-color: color-mix(in srgb, var(--ui-accent) 25%, var(--ui-border-default));
43
+ background: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
44
+ }
45
+
46
+ :scope[data-ui-card-state~="tone=info"] {
47
+ border-color: color-mix(in srgb, var(--ui-info) 25%, var(--ui-border-default));
48
+ background: color-mix(in srgb, var(--ui-info) 6%, var(--ui-surface-default));
49
+ }
50
+
51
+ :scope[data-ui-card-state~="tone=success"] {
52
+ border-color: color-mix(in srgb, var(--ui-success) 25%, var(--ui-border-default));
53
+ background: color-mix(in srgb, var(--ui-success) 6%, var(--ui-surface-default));
54
+ }
55
+
56
+ :scope[data-ui-card-state~="tone=warning"] {
57
+ border-color: color-mix(in srgb, var(--ui-warning) 25%, var(--ui-border-default));
58
+ background: color-mix(in srgb, var(--ui-warning) 6%, var(--ui-surface-default));
59
+ }
60
+
61
+ :scope[data-ui-card-state~="variant=subtle"]:is([data-ui-card-state~="tone=accent"], [data-ui-card-state~="tone=info"], [data-ui-card-state~="tone=success"], [data-ui-card-state~="tone=warning"]) {
62
+ border-color: transparent;
63
+ }
64
+
41
65
  :scope[data-ui-card-state~="tone=danger"] {
42
66
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
43
67
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
@@ -17,6 +17,31 @@
17
17
  margin: 0;
18
18
  }
19
19
 
20
+ :scope[data-ui-cluster-state~="fixed"] {
21
+ flex: none;
22
+ }
23
+ :scope[data-ui-cluster-state~="padding=s"] {
24
+ padding: var(--ui-space-2);
25
+ }
26
+ :scope[data-ui-cluster-state~="padding=m"] {
27
+ padding: var(--ui-space-3);
28
+ }
29
+ :scope[data-ui-cluster-state~="padding=l"] {
30
+ padding: var(--ui-space-4);
31
+ }
32
+ :scope[data-ui-cluster-state~="paddingEnd=s"] {
33
+ padding-inline-end: var(--ui-space-2);
34
+ }
35
+ :scope[data-ui-cluster-state~="paddingEnd=m"] {
36
+ padding-inline-end: var(--ui-space-3);
37
+ }
38
+ :scope[data-ui-cluster-state~="paddingEnd=l"] {
39
+ padding-inline-end: var(--ui-space-4);
40
+ }
41
+ :scope[data-ui-cluster-state~="paddingEnd=xl"] {
42
+ padding-inline-end: calc(var(--ui-space-4) * 4);
43
+ }
44
+
20
45
  :scope[data-ui-cluster-state~="gap=xs"] {
21
46
  --_layout-gap: var(--ui-space-2);
22
47
  }
@@ -0,0 +1,19 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.29. Do not edit. */
2
+ @scope ([data-component~="ui-editor-surface"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ display: flex;
5
+ flex-direction: column;
6
+ min-inline-size: 0;
7
+ max-inline-size: 100%;
8
+ }
9
+ /* The document renderer consumes these inherited surface settings. They do not style controls. */
10
+ :scope[data-ui-editor-surface-state~="density=compact"] {
11
+ --_ui-editor-content-min-height: 0px;
12
+ --_ui-editor-content-padding-block: 0px;
13
+ --_ui-editor-content-padding-inline: 0px;
14
+ --_ui-editor-mobile-bottom-space: 0px;
15
+ }
16
+ }
17
+ @scope ([data-component~="ui-editor-surface"]) to ([data-component]) {
18
+ /* The document renderer consumes these inherited surface settings. They do not style controls. */
19
+ }
@@ -3,6 +3,10 @@
3
3
  /* The controller sets each fade length from overflow and scroll position. The mask blends
4
4
  into whatever is behind the area without needing to know its colour. Before upgrade, its
5
5
  zero-length defaults leave the authored scroll area fully visible. */
6
+ :scope[data-ui-scroll-area-state~="fill"] {
7
+ flex: 1;
8
+ }
9
+
6
10
  :scope {
7
11
  display: block;
8
12
  box-sizing: border-box;
@@ -1,4 +1,8 @@
1
1
  /* Generated by HTML Next 1.0.0-alpha.29. Do not edit. */
2
+ @property --ui-stack-height {
3
+ syntax: "*";
4
+ inherits: false;
5
+ }
2
6
  @property --ui-stack-gap {
3
7
  syntax: "*";
4
8
  inherits: false;
@@ -17,6 +21,15 @@
17
21
  margin: 0;
18
22
  }
19
23
 
24
+ :scope[data-ui-stack-state~="fill"] {
25
+ flex: 1;
26
+ min-block-size: 0;
27
+ }
28
+ :scope[data-ui-stack-state~="height"] {
29
+ block-size: calc(var(--ui-stack-height, 0) * 1px);
30
+ min-block-size: 0;
31
+ }
32
+
20
33
  :scope[data-ui-stack-state~="gap=none"] {
21
34
  --_layout-gap: 0px;
22
35
  }
@@ -3,6 +3,10 @@
3
3
  /* Running text, set on the type scale and in a tone that says what it is, so a view never styles
4
4
  text of its own. The root is a paragraph unless as= names a span, div, small, strong, label, or
5
5
  heading. */
6
+ :scope[data-ui-text-state~="grow"] {
7
+ flex: 1;
8
+ }
9
+
6
10
  :scope {
7
11
  margin: 0;
8
12
  min-inline-size: 0;
@@ -139,6 +139,10 @@
139
139
  font-size: var(--ui-font-size-md);
140
140
  }
141
141
 
142
+ :scope[data-ui-textarea-state~="maxRows"] {
143
+ max-block-size: calc(max(var(--_rows), var(--_max-rows)) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px);
144
+ }
145
+
142
146
  @supports (field-sizing: content) {
143
147
  :scope[data-ui-textarea-state~="autosize"] {
144
148
  field-sizing: content;
@@ -9,7 +9,7 @@ export interface UiCardProps {
9
9
  as?: "div" | "section" | "article" | "aside" | null;
10
10
  padding?: "xs" | "sm" | "md" | "lg" | null;
11
11
  size?: "content" | "sm" | "md" | "lg" | null;
12
- tone?: "neutral" | "danger" | null;
12
+ tone?: "neutral" | "accent" | "info" | "success" | "warning" | "danger" | null;
13
13
  variant?: "outlined" | "subtle" | "elevated" | null;
14
14
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
15
15
  children?: readonly (string | Node)[];
package/vanilla/UiCard.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { componentRootIndex, manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import "../styles/ui-card.css";
4
4
 
5
- const definition = {...{"contract":{"tag":"ui-card","props":{"as":{"type":{"kind":"terminal","name":"keyword"},"values":["div","section","article","aside"],"required":false,"target":{"attribute":"as"},"default":"div"},"padding":{"type":{"kind":"terminal","name":"keyword"},"values":["xs","sm","md","lg"],"required":false,"target":{"attribute":"padding"},"default":"md"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["content","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"content"},"tone":{"type":{"kind":"terminal","name":"keyword"},"values":["neutral","danger"],"required":false,"target":{"attribute":"tone"},"default":"neutral"},"variant":{"type":{"kind":"terminal","name":"keyword"},"values":["outlined","subtle","elevated"],"required":false,"target":{"attribute":"variant"},"default":"outlined"}}},"template":{"kind":"element","name":"template","attributes":[],"children":[{"kind":"element","name":"section","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'section'","testPlan":{"source":"as = 'section'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"section"}},"dependencies":["as"]}}},{"kind":"element","name":"article","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'article'","testPlan":{"source":"as = 'article'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"article"}},"dependencies":["as"]}}},{"kind":"element","name":"aside","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'aside'","testPlan":{"source":"as = 'aside'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"aside"}},"dependencies":["as"]}}},{"kind":"element","name":"div","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"else"}}],"flow":{"kind":"match"}},"declarations":[],"root":{"kind":"native","element":"div","choices":["section","article","aside","div"]}},source:{file:import.meta.url},css:""};
5
+ const definition = {...{"contract":{"tag":"ui-card","props":{"as":{"type":{"kind":"terminal","name":"keyword"},"values":["div","section","article","aside"],"required":false,"target":{"attribute":"as"},"default":"div"},"padding":{"type":{"kind":"terminal","name":"keyword"},"values":["xs","sm","md","lg"],"required":false,"target":{"attribute":"padding"},"default":"md"},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["content","sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"content"},"tone":{"type":{"kind":"terminal","name":"keyword"},"values":["neutral","accent","info","success","warning","danger"],"required":false,"target":{"attribute":"tone"},"default":"neutral"},"variant":{"type":{"kind":"terminal","name":"keyword"},"values":["outlined","subtle","elevated"],"required":false,"target":{"attribute":"variant"},"default":"outlined"}}},"template":{"kind":"element","name":"template","attributes":[],"children":[{"kind":"element","name":"section","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'section'","testPlan":{"source":"as = 'section'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"section"}},"dependencies":["as"]}}},{"kind":"element","name":"article","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'article'","testPlan":{"source":"as = 'article'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"article"}},"dependencies":["as"]}}},{"kind":"element","name":"aside","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"when","test":"as = 'aside'","testPlan":{"source":"as = 'aside'","ast":{"kind":"binary","op":"=","left":{"kind":"id","name":"as"},"right":{"kind":"literal","value":"aside"}},"dependencies":["as"]}}},{"kind":"element","name":"div","attributes":[],"children":[{"kind":"slot"}],"flow":{"kind":"else"}}],"flow":{"kind":"match"}},"declarations":[],"root":{"kind":"native","element":"div","choices":["section","article","aside","div"]}},source:{file:import.meta.url},css:""};
6
6
 
7
7
  export function createUiCard(options = {}) {
8
8
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -7,8 +7,11 @@ export interface UiClusterElement extends HTMLDivElement {
7
7
  }
8
8
  export interface UiClusterProps {
9
9
  align?: "start" | "center" | "end" | "stretch" | null;
10
+ fixed?: boolean | null;
10
11
  gap?: "xs" | "s" | "m" | "l" | "xl" | null;
11
12
  justify?: "start" | "center" | "end" | "between" | null;
13
+ padding?: "none" | "s" | "m" | "l" | null;
14
+ paddingEnd?: "none" | "s" | "m" | "l" | "xl" | null;
12
15
  wrap?: "wrap" | "nowrap" | null;
13
16
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
14
17
  children?: readonly (string | Node)[];
@@ -6,9 +6,12 @@ export function createUiCluster(options = {}) {
6
6
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
7
7
  const projected = [];
8
8
  const prop0 = componentProps["align"] === undefined ? undefined : componentProps["align"];
9
- const prop1 = componentProps["gap"] === undefined ? undefined : componentProps["gap"];
10
- const prop2 = componentProps["justify"] === undefined ? undefined : componentProps["justify"];
11
- const prop3 = componentProps["wrap"] === undefined ? undefined : componentProps["wrap"];
9
+ const prop1 = componentProps["fixed"] === undefined ? false : componentProps["fixed"];
10
+ const prop2 = componentProps["gap"] === undefined ? undefined : componentProps["gap"];
11
+ const prop3 = componentProps["justify"] === undefined ? undefined : componentProps["justify"];
12
+ const prop4 = componentProps["padding"] === undefined ? "none" : componentProps["padding"];
13
+ const prop5 = componentProps["paddingEnd"] === undefined ? "none" : componentProps["paddingEnd"];
14
+ const prop6 = componentProps["wrap"] === undefined ? undefined : componentProps["wrap"];
12
15
  const element = document.createElement("div");
13
16
  for (const [name, value] of Object.entries(attributes)) {
14
17
  if (value === null || value === undefined || value === false) continue;
@@ -26,8 +29,11 @@ export function createUiCluster(options = {}) {
26
29
  }
27
30
  manageGeneratedProps(element, [
28
31
  { name: "align", attribute: "data-align", value: componentProps["align"], type: ["start","center","end","stretch"], required: false },
32
+ { name: "fixed", attribute: "data-fixed", value: componentProps["fixed"], default: false, type: "boolean", required: false },
29
33
  { name: "gap", attribute: "data-gap", value: componentProps["gap"], type: ["xs","s","m","l","xl"], required: false },
30
34
  { name: "justify", attribute: "data-justify", value: componentProps["justify"], type: ["start","center","end","between"], required: false },
35
+ { name: "padding", attribute: "data-padding", value: componentProps["padding"], default: "none", type: ["none","s","m","l"], required: false },
36
+ { name: "paddingEnd", attribute: "data-padding-end", value: componentProps["paddingEnd"], default: "none", type: ["none","s","m","l","xl"], required: false },
31
37
  { name: "wrap", attribute: "data-wrap", value: componentProps["wrap"], type: ["wrap","nowrap"], required: false },
32
38
  ]);
33
39
  return element;
@@ -0,0 +1,14 @@
1
+ // Generated by HTML Next 1.0.0-alpha.29 for Vanilla DOM. Do not edit.
2
+ export interface UiEditorSurfaceEventMap {
3
+ }
4
+ export interface UiEditorSurfaceElement extends HTMLDivElement {
5
+ addEventListener<K extends keyof UiEditorSurfaceEventMap>(type: K, listener: (this: UiEditorSurfaceElement, event: UiEditorSurfaceEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
6
+ removeEventListener<K extends keyof UiEditorSurfaceEventMap>(type: K, listener: (this: UiEditorSurfaceElement, event: UiEditorSurfaceEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
7
+ }
8
+ export interface UiEditorSurfaceProps {
9
+ density?: "comfortable" | "compact" | null;
10
+ attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
11
+ children?: readonly (string | Node)[];
12
+ slots?: Readonly<Record<string, readonly (string | Node)[]>>;
13
+ }
14
+ export declare function createUiEditorSurface(props?: UiEditorSurfaceProps): UiEditorSurfaceElement;
@@ -0,0 +1,27 @@
1
+ // Generated by HTML Next 1.0.0-alpha.29 for Vanilla DOM. Do not edit.
2
+ import { manageGeneratedProp } from "@nextwebwg/html-next/generated-runtime";
3
+ import "../styles/ui-editor-surface.css";
4
+
5
+ export function createUiEditorSurface(options = {}) {
6
+ const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
7
+ const projected = [];
8
+ const prop0 = componentProps["density"] === undefined ? "comfortable" : componentProps["density"];
9
+ const element = document.createElement("div");
10
+ for (const [name, value] of Object.entries(attributes)) {
11
+ if (value === null || value === undefined || value === false) continue;
12
+ element.setAttribute(name, value === true ? "" : String(value));
13
+ }
14
+ element.setAttribute("data-component", "ui-editor-surface");
15
+ if (children.length > 0) {
16
+ for (const child of children) {
17
+ const node = typeof child === "string" ? document.createTextNode(child) : child;
18
+ if (node.nodeType === 1) node.setAttribute("data-slotted", "");
19
+ projected.push([node, ""]);
20
+ element.append(node);
21
+ }
22
+ } else {
23
+ }
24
+ manageGeneratedProp(element, { name: "density", attribute: "data-density", value: componentProps["density"], default: "comfortable", type: ["comfortable","compact"], required: false });
25
+ return element;
26
+ }
27
+
@@ -6,6 +6,7 @@ export interface UiScrollAreaElement extends HTMLDivElement {
6
6
  removeEventListener<K extends keyof UiScrollAreaEventMap>(type: K, listener: (this: UiScrollAreaElement, event: UiScrollAreaEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
7
7
  }
8
8
  export interface UiScrollAreaProps {
9
+ fill?: boolean | null;
9
10
  orientation?: "vertical" | "horizontal" | null;
10
11
  size?: "content" | "sm" | "md" | "lg" | null;
11
12
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
@@ -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"},"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:""};
6
+ const definition = {...{"contract":{"tag":"ui-scroll-area","props":{"fill":{"type":"boolean","required":false,"target":{"attribute":"fill"},"default":false},"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;
@@ -7,7 +7,9 @@ export interface UiStackElement extends HTMLDivElement {
7
7
  }
8
8
  export interface UiStackProps {
9
9
  align?: "start" | "center" | "end" | "stretch" | null;
10
+ fill?: boolean | null;
10
11
  gap?: "none" | "xs" | "s" | "m" | "l" | "xl" | null;
12
+ height?: number | null;
11
13
  justify?: "start" | "center" | "end" | "between" | null;
12
14
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
13
15
  children?: readonly (string | Node)[];
@@ -1,18 +1,20 @@
1
1
  // Generated by HTML Next 1.0.0-alpha.29 for Vanilla DOM. Do not edit.
2
- import { manageGeneratedProps } from "@nextwebwg/html-next/generated-runtime";
2
+ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import "../styles/ui-stack.css";
4
4
 
5
+ const definition = {...{"contract":{"tag":"ui-stack","props":{"align":{"type":{"kind":"terminal","name":"keyword"},"values":["start","center","end","stretch"],"required":false,"target":{"attribute":"align"}},"fill":{"type":"boolean","required":false,"target":{"attribute":"fill"},"default":false},"gap":{"type":{"kind":"terminal","name":"keyword"},"values":["none","xs","s","m","l","xl"],"required":false,"target":{"attribute":"gap"}},"height":{"type":"number","required":false,"target":{"attribute":"height"}},"justify":{"type":{"kind":"terminal","name":"keyword"},"values":["start","center","end","between"],"required":false,"target":{"attribute":"justify"}}}},"template":{"kind":"element","name":"div","attributes":[{"kind":"attribute","name":"--ui-stack-height","expression":"height","expressionPlan":{"source":"height","ast":{"kind":"id","name":"height"},"dependencies":["height"]},"target":"style"}],"children":[{"kind":"slot"}]},"declarations":[],"root":{"kind":"native","element":"div","choices":["div"]}},source:{file:import.meta.url},css:""};
6
+
5
7
  export function createUiStack(options = {}) {
6
8
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
7
9
  const projected = [];
8
- const prop0 = componentProps["align"] === undefined ? undefined : componentProps["align"];
9
- const prop1 = componentProps["gap"] === undefined ? undefined : componentProps["gap"];
10
- const prop2 = componentProps["justify"] === undefined ? undefined : componentProps["justify"];
11
10
  const element = document.createElement("div");
12
11
  for (const [name, value] of Object.entries(attributes)) {
13
12
  if (value === null || value === undefined || value === false) continue;
14
13
  element.setAttribute(name, value === true ? "" : String(value));
15
14
  }
15
+ const value0 = componentProps["height"] === undefined ? null : componentProps["height"];
16
+ if (value0 === null || value0 === undefined) element.removeAttribute("--ui-stack-height");
17
+ else element.setAttribute("--ui-stack-height", String(value0));
16
18
  element.setAttribute("data-component", "ui-stack");
17
19
  if (children.length > 0) {
18
20
  for (const child of children) {
@@ -23,11 +25,8 @@ export function createUiStack(options = {}) {
23
25
  }
24
26
  } else {
25
27
  }
26
- manageGeneratedProps(element, [
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: ["none","xs","s","m","l","xl"], required: false },
29
- { name: "justify", attribute: "data-justify", value: componentProps["justify"], type: ["start","center","end","between"], required: false },
30
- ]);
28
+ manageComponentLifecycle(element, definition, { props: componentProps, projected,
29
+ });
31
30
  return element;
32
31
  }
33
32
 
@@ -9,6 +9,7 @@ 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
11
  font?: "inherit" | "sans" | null;
12
+ grow?: boolean | null;
12
13
  size?: "inherit" | "xs" | "sm" | "md" | "lg" | null;
13
14
  tone?: "default" | "secondary" | "muted" | "accent" | "danger" | "success" | "info" | "warning" | null;
14
15
  truncate?: boolean | null;
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"},"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:""};
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"},"grow":{"type":"boolean","required":false,"target":{"attribute":"grow"},"default":false},"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;
@@ -9,6 +9,7 @@ export interface UiTextareaProps {
9
9
  autosize?: boolean | null;
10
10
  disabled?: boolean | null;
11
11
  invalid?: boolean | null;
12
+ maxRows?: number | null;
12
13
  readonly?: boolean | null;
13
14
  required?: boolean | null;
14
15
  rows?: number | null;
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-textarea/ui-textarea.js";
4
4
  import "../styles/ui-textarea.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-textarea","props":{"autosize":{"type":"boolean","required":false,"target":{"attribute":"autosize"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"invalid":{"type":"boolean","required":false,"target":{"attribute":"aria-invalid"},"default":false},"readonly":{"type":"boolean","required":false,"target":{"attribute":"readonly"},"default":false},"required":{"type":"boolean","required":false,"target":{"attribute":"required"},"default":false},"rows":{"type":{"kind":"terminal","name":"integer"},"required":false,"target":{"attribute":"rows"},"default":4},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"md"},"value":{"type":"string","required":false,"target":{"attribute":"value"}}}},"template":{"kind":"element","name":"textarea","attributes":[{"kind":"attribute","name":"value","expression":"value","expressionPlan":{"source":"value","ast":{"kind":"id","name":"value"},"dependencies":["value"]}},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"readonly","expression":"readonly","expressionPlan":{"source":"readonly","ast":{"kind":"id","name":"readonly"},"dependencies":["readonly"]}},{"kind":"attribute","name":"required","expression":"required","expressionPlan":{"source":"required","ast":{"kind":"id","name":"required"},"dependencies":["required"]}},{"kind":"attribute","name":"aria-invalid","expression":"invalid","expressionPlan":{"source":"invalid","ast":{"kind":"id","name":"invalid"},"dependencies":["invalid"]}},{"kind":"attribute","name":"rows","expression":"rows","expressionPlan":{"source":"rows","ast":{"kind":"id","name":"rows"},"dependencies":["rows"]}},{"kind":"attribute","name":"--_rows","expression":"rows","expressionPlan":{"source":"rows","ast":{"kind":"id","name":"rows"},"dependencies":["rows"]},"target":"style"}],"children":[]},"declarations":[],"root":{"kind":"native","element":"textarea","choices":["textarea"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-textarea","props":{"autosize":{"type":"boolean","required":false,"target":{"attribute":"autosize"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"invalid":{"type":"boolean","required":false,"target":{"attribute":"aria-invalid"},"default":false},"maxRows":{"type":{"kind":"terminal","name":"integer"},"required":false,"target":{"attribute":"maxrows"}},"readonly":{"type":"boolean","required":false,"target":{"attribute":"readonly"},"default":false},"required":{"type":"boolean","required":false,"target":{"attribute":"required"},"default":false},"rows":{"type":{"kind":"terminal","name":"integer"},"required":false,"target":{"attribute":"rows"},"default":4},"size":{"type":{"kind":"terminal","name":"keyword"},"values":["sm","md","lg"],"required":false,"target":{"attribute":"size"},"default":"md"},"value":{"type":"string","required":false,"target":{"attribute":"value"}}}},"template":{"kind":"element","name":"textarea","attributes":[{"kind":"attribute","name":"value","expression":"value","expressionPlan":{"source":"value","ast":{"kind":"id","name":"value"},"dependencies":["value"]}},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"readonly","expression":"readonly","expressionPlan":{"source":"readonly","ast":{"kind":"id","name":"readonly"},"dependencies":["readonly"]}},{"kind":"attribute","name":"required","expression":"required","expressionPlan":{"source":"required","ast":{"kind":"id","name":"required"},"dependencies":["required"]}},{"kind":"attribute","name":"aria-invalid","expression":"invalid","expressionPlan":{"source":"invalid","ast":{"kind":"id","name":"invalid"},"dependencies":["invalid"]}},{"kind":"attribute","name":"rows","expression":"rows","expressionPlan":{"source":"rows","ast":{"kind":"id","name":"rows"},"dependencies":["rows"]}},{"kind":"attribute","name":"--_rows","expression":"rows","expressionPlan":{"source":"rows","ast":{"kind":"id","name":"rows"},"dependencies":["rows"]},"target":"style"},{"kind":"attribute","name":"--_max-rows","expression":"maxRows","expressionPlan":{"source":"maxRows","ast":{"kind":"id","name":"maxRows"},"dependencies":["maxRows"]},"target":"style"}],"children":[]},"declarations":[],"root":{"kind":"native","element":"textarea","choices":["textarea"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiTextarea(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -34,6 +34,9 @@ export function createUiTextarea(options = {}) {
34
34
  const value6 = componentProps["rows"] === undefined ? 4 : componentProps["rows"];
35
35
  if (value6 === null || value6 === undefined) element.removeAttribute("--_rows");
36
36
  else element.setAttribute("--_rows", String(value6));
37
+ const value7 = componentProps["maxRows"] === undefined ? null : componentProps["maxRows"];
38
+ if (value7 === null || value7 === undefined) element.removeAttribute("--_max-rows");
39
+ else element.setAttribute("--_max-rows", String(value7));
37
40
  element.setAttribute("data-component", "ui-textarea");
38
41
  manageComponentLifecycle(element, definition, { props: componentProps, projected,
39
42
  controller,
package/vanilla/index.js CHANGED
@@ -25,6 +25,7 @@ export * from "./UiEditorMentionMenuItem.js";
25
25
  export * from "./UiEditorSlashMenu.js";
26
26
  export * from "./UiEditorSlashMenuGroup.js";
27
27
  export * from "./UiEditorSlashMenuItem.js";
28
+ export * from "./UiEditorSurface.js";
28
29
  export * from "./UiEditorTableContextMenu.js";
29
30
  export * from "./UiEditorTableOverlay.js";
30
31
  export * from "./UiEditorTableToolbar.js";
package/vue/UiCard.d.ts CHANGED
@@ -23,7 +23,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
23
23
  default: string;
24
24
  };
25
25
  tone: {
26
- type: PropType<"neutral" | "danger" | null>;
26
+ type: PropType<"neutral" | "accent" | "info" | "success" | "warning" | "danger" | null>;
27
27
  default: string;
28
28
  };
29
29
  variant: {
@@ -44,7 +44,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
44
44
  default: string;
45
45
  };
46
46
  tone: {
47
- type: PropType<"neutral" | "danger" | null>;
47
+ type: PropType<"neutral" | "accent" | "info" | "success" | "warning" | "danger" | null>;
48
48
  default: string;
49
49
  };
50
50
  variant: {
@@ -53,7 +53,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
53
53
  };
54
54
  }>> & Readonly<{}>, {
55
55
  size: "sm" | "md" | "content" | "lg" | null;
56
- tone: "neutral" | "danger" | null;
56
+ tone: "info" | "neutral" | "accent" | "success" | "warning" | "danger" | null;
57
57
  variant: "subtle" | "outlined" | "elevated" | null;
58
58
  as: "div" | "article" | "aside" | "section" | null;
59
59
  padding: "xs" | "sm" | "md" | "lg" | null;
package/vue/UiCard.vue CHANGED
@@ -41,8 +41,8 @@ const propValidityContract = {
41
41
  required: false,
42
42
  target: { attribute: 'tone' },
43
43
  description:
44
- 'danger adds a soft danger surface and a strong leading edge for consequential content.',
45
- values: ['neutral', 'danger'],
44
+ 'accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Tone never changes child\n controls.',
45
+ values: ['neutral', 'accent', 'info', 'success', 'warning', 'danger'],
46
46
  default: 'neutral',
47
47
  },
48
48
  variant: {
@@ -66,7 +66,12 @@ const props = defineProps({
66
66
  type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
67
67
  default: 'content',
68
68
  },
69
- tone: { type: null as unknown as PropType<'neutral' | 'danger' | null>, default: 'neutral' },
69
+ tone: {
70
+ type: null as unknown as PropType<
71
+ 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger' | null
72
+ >,
73
+ default: 'neutral',
74
+ },
70
75
  variant: {
71
76
  type: null as unknown as PropType<'outlined' | 'subtle' | 'elevated' | null>,
72
77
  default: 'outlined',
@@ -101,13 +106,13 @@ const checkedProps = computed(() => ({
101
106
  'size',
102
107
  acceptedProps,
103
108
  ) as 'content' | 'sm' | 'md' | 'lg',
104
- tone: checkedProp<'neutral' | 'danger'>(
109
+ tone: checkedProp<'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger'>(
105
110
  props['tone'],
106
111
  { kind: 'terminal', name: 'keyword' },
107
112
  false,
108
113
  'tone',
109
114
  acceptedProps,
110
- ) as 'neutral' | 'danger',
115
+ ) as 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger',
111
116
  variant: checkedProp<'outlined' | 'subtle' | 'elevated'>(
112
117
  props['variant'],
113
118
  { kind: 'terminal', name: 'keyword' },
@@ -295,6 +300,30 @@ const hostState = computed(() =>
295
300
  box-shadow: var(--ui-shadow-lg);
296
301
  }
297
302
 
303
+ [data-component~="ui-card"][data-ui-card-state~="tone=accent"] {
304
+ border-color: color-mix(in srgb, var(--ui-accent) 25%, var(--ui-border-default));
305
+ background: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
306
+ }
307
+
308
+ [data-component~="ui-card"][data-ui-card-state~="tone=info"] {
309
+ border-color: color-mix(in srgb, var(--ui-info) 25%, var(--ui-border-default));
310
+ background: color-mix(in srgb, var(--ui-info) 6%, var(--ui-surface-default));
311
+ }
312
+
313
+ [data-component~="ui-card"][data-ui-card-state~="tone=success"] {
314
+ border-color: color-mix(in srgb, var(--ui-success) 25%, var(--ui-border-default));
315
+ background: color-mix(in srgb, var(--ui-success) 6%, var(--ui-surface-default));
316
+ }
317
+
318
+ [data-component~="ui-card"][data-ui-card-state~="tone=warning"] {
319
+ border-color: color-mix(in srgb, var(--ui-warning) 25%, var(--ui-border-default));
320
+ background: color-mix(in srgb, var(--ui-warning) 6%, var(--ui-surface-default));
321
+ }
322
+
323
+ [data-component~="ui-card"][data-ui-card-state~="variant=subtle"]:is([data-ui-card-state~="tone=accent"], [data-ui-card-state~="tone=info"], [data-ui-card-state~="tone=success"], [data-ui-card-state~="tone=warning"]) {
324
+ border-color: transparent;
325
+ }
326
+
298
327
  [data-component~="ui-card"][data-ui-card-state~="tone=danger"] {
299
328
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
300
329
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);