@ctrl-ui/react 0.9.10 → 0.9.12

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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/control-variants.d.ts +1 -1
  3. package/dist/control-variants.js +1 -0
  4. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  5. package/dist/knob-contracts/button-knobs.js +11 -5
  6. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  7. package/dist/knob-contracts/collapsible-knobs.js +1 -0
  8. package/dist/knob-contracts/dropzone-knobs.d.ts +1 -1
  9. package/dist/knob-contracts/dropzone-knobs.js +5 -1
  10. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  11. package/dist/knob-contracts/field-knobs.js +9 -0
  12. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  13. package/dist/knob-contracts/page-layout-knobs.js +1 -0
  14. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  15. package/dist/knob-contracts/popup-knobs.js +3 -2
  16. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  17. package/dist/knob-contracts/sidebar-knobs.js +1 -0
  18. package/dist/lib/phone-input-format.js +1 -1
  19. package/dist/styles/recipes/avatar.css +2 -0
  20. package/dist/styles/recipes/button-states.css +43 -0
  21. package/dist/styles/recipes/button.css +29 -21
  22. package/dist/styles/recipes/collapsible.css +8 -1
  23. package/dist/styles/recipes/dropzone.css +47 -4
  24. package/dist/styles/recipes/field-parts.css +93 -0
  25. package/dist/styles/recipes/page-layout.css +8 -1
  26. package/dist/styles/recipes/popup-controls.css +7 -1
  27. package/dist/styles/recipes/popup-lists.css +13 -5
  28. package/dist/styles/recipes/popup.css +2 -6
  29. package/dist/styles/recipes/sidebar-parts.css +6 -0
  30. package/dist/styles/recipes/sidebar.css +9 -8
  31. package/dist/styles/recipes/table.css +29 -0
  32. package/dist/ui/command.js +1 -1
  33. package/dist/ui/dropzone.d.ts +4 -1
  34. package/dist/ui/dropzone.js +16 -8
  35. package/dist/ui/field.d.ts +4 -1
  36. package/dist/ui/field.js +4 -2
  37. package/dist/ui/phone-input.js +2 -2
  38. package/dist/ui/table.d.ts +6 -0
  39. package/dist/ui/table.js +17 -1
  40. package/lint/class-policy.mjs +31 -1
  41. package/lint/eslint-plugin.mjs +48 -4
  42. package/lint/grit-rules.mjs +52 -11
  43. package/lint/no-component-style-classes.grit +41 -6
  44. package/lint/no-raw-type-classes.grit +1 -1
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -51,7 +51,7 @@ Controls size their own text: pick the control's `size`, or set its `--cui-*-fon
51
51
 
52
52
  Two rules keep call sites honest, shipped for Biome, ESLint, and oxlint from one policy (`lint/class-policy.mjs`):
53
53
 
54
- - `no-component-style-classes` errors when `className` on a component imported from `@ctrl-ui/react` (or a `components/control-ui` directory) sets what the component owns: colors, type, padding, borders, radius, shadows, state styles such as `hover:` and `data-[…]:`, or `!important`. Layout classes (`flex`, `gap-*`, widths, heights, margins, placement) stay allowed. Restyle through the component's props or its `--cui-*` knobs instead.
54
+ - `no-component-style-classes` errors when `className` on a component imported from `@ctrl-ui/react` (or a `components/control-ui` directory) sets what the component owns: colors, type, padding, borders, radius, shadows, state styles such as `hover:` and `data-[…]:`, or `!important`. Every `text-*` class counts except alignment and wrapping (`text-center`, `text-pretty`, `text-ellipsis`…). The rule also reads string constants the `className` references in the same file, and the `className` of the element passed to the component's `render` prop. Layout classes (`flex`, `gap-*`, widths, heights, margins, placement) stay allowed. Restyle through the component's props or its `--cui-*` knobs instead.
55
55
  - `no-raw-type-classes` errors on text sizes in any `className`: the type rungs, Tailwind's `text-xs`…`text-9xl`, and arbitrary `text-[13px]`. It reaches beyond Control UI, so adopt it folder by folder while you migrate.
56
56
 
57
57
  Biome, extending the shipped preset so rules added later arrive with the package update:
@@ -1,6 +1,6 @@
1
1
  //#region src/control-variants.d.ts
2
2
  export type ControlSize = "xs" | "sm" | "md" | "lg";
3
- export declare const buttonVariants: readonly ["solid", "surface", "ghost", "quiet", "link"];
3
+ export declare const buttonVariants: readonly ["solid", "surface", "ghost", "quiet", "dashed", "link"];
4
4
  export type ButtonVariant = (typeof buttonVariants)[number];
5
5
  export declare const controlTones: readonly ["neutral", "primary", "danger"];
6
6
  export type ControlTone = (typeof controlTones)[number];
@@ -4,6 +4,7 @@ const buttonVariants = [
4
4
  "surface",
5
5
  "ghost",
6
6
  "quiet",
7
+ "dashed",
7
8
  "link"
8
9
  ];
9
10
  const controlTones = [
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/button-knobs.d.ts
2
- export declare const buttonKnobs: readonly ["--cui-button-radius", "--cui-button-gap", "--cui-button-icon", "--cui-button-height", "--cui-button-padding-inline", "--cui-button-icon-padding-inline", "--cui-button-font-size", "--cui-button-font-weight", "--cui-button-background", "--cui-button-background-image", "--cui-button-hover-background-image", "--cui-button-foreground", "--cui-button-hover-background", "--cui-button-hover-foreground", "--cui-button-press-background", "--cui-button-press-scale", "--cui-button-active-background", "--cui-button-active-foreground", "--cui-button-active-hover-background", "--cui-button-shadow", "--cui-button-hover-shadow", "--cui-button-press-shadow", "--cui-button-active-shadow", "--cui-button-open-background", "--cui-button-open-foreground", "--cui-button-open-shadow"];
2
+ export declare const buttonKnobs: readonly ["--cui-button-press-background", "--cui-button-press-scale", "--cui-button-hover-border-color", "--cui-button-open-border-color", "--cui-button-open-background", "--cui-button-open-foreground", "--cui-button-open-shadow", "--cui-button-radius", "--cui-button-gap", "--cui-button-icon", "--cui-button-height", "--cui-button-padding-inline", "--cui-button-padding-block", "--cui-button-icon-padding-inline", "--cui-button-font-size", "--cui-button-font-weight", "--cui-button-background", "--cui-button-background-image", "--cui-button-hover-background-image", "--cui-button-foreground", "--cui-button-hover-background", "--cui-button-hover-foreground", "--cui-button-active-background", "--cui-button-active-foreground", "--cui-button-active-hover-background", "--cui-button-shadow", "--cui-button-hover-shadow", "--cui-button-press-shadow", "--cui-button-active-shadow", "--cui-button-border-width", "--cui-button-border-style", "--cui-button-border-color"];
3
3
  export type ButtonKnobStyle = Partial<Record<(typeof buttonKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,10 +1,18 @@
1
1
  //#region src/knob-contracts/button-knobs.ts
2
2
  const buttonKnobs = [
3
+ "--cui-button-press-background",
4
+ "--cui-button-press-scale",
5
+ "--cui-button-hover-border-color",
6
+ "--cui-button-open-border-color",
7
+ "--cui-button-open-background",
8
+ "--cui-button-open-foreground",
9
+ "--cui-button-open-shadow",
3
10
  "--cui-button-radius",
4
11
  "--cui-button-gap",
5
12
  "--cui-button-icon",
6
13
  "--cui-button-height",
7
14
  "--cui-button-padding-inline",
15
+ "--cui-button-padding-block",
8
16
  "--cui-button-icon-padding-inline",
9
17
  "--cui-button-font-size",
10
18
  "--cui-button-font-weight",
@@ -14,8 +22,6 @@ const buttonKnobs = [
14
22
  "--cui-button-foreground",
15
23
  "--cui-button-hover-background",
16
24
  "--cui-button-hover-foreground",
17
- "--cui-button-press-background",
18
- "--cui-button-press-scale",
19
25
  "--cui-button-active-background",
20
26
  "--cui-button-active-foreground",
21
27
  "--cui-button-active-hover-background",
@@ -23,9 +29,9 @@ const buttonKnobs = [
23
29
  "--cui-button-hover-shadow",
24
30
  "--cui-button-press-shadow",
25
31
  "--cui-button-active-shadow",
26
- "--cui-button-open-background",
27
- "--cui-button-open-foreground",
28
- "--cui-button-open-shadow"
32
+ "--cui-button-border-width",
33
+ "--cui-button-border-style",
34
+ "--cui-button-border-color"
29
35
  ];
30
36
  //#endregion
31
37
  export { buttonKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/collapsible-knobs.d.ts
2
- export declare const collapsibleKnobs: readonly ["--cui-collapsible-trigger-radius", "--cui-collapsible-trigger-hover-background", "--cui-collapsible-trigger-padding-inline", "--cui-collapsible-trigger-padding-block", "--cui-collapsible-trigger-foreground", "--cui-collapsible-trigger-hover-foreground"];
2
+ export declare const collapsibleKnobs: readonly ["--cui-collapsible-trigger-radius", "--cui-collapsible-trigger-hover-background", "--cui-collapsible-trigger-padding-inline", "--cui-collapsible-trigger-padding-block", "--cui-collapsible-trigger-font-size", "--cui-collapsible-trigger-foreground", "--cui-collapsible-trigger-hover-foreground"];
3
3
  export type CollapsibleKnobStyle = Partial<Record<(typeof collapsibleKnobs)[number], string>>;
4
4
  //#endregion
@@ -4,6 +4,7 @@ const collapsibleKnobs = [
4
4
  "--cui-collapsible-trigger-hover-background",
5
5
  "--cui-collapsible-trigger-padding-inline",
6
6
  "--cui-collapsible-trigger-padding-block",
7
+ "--cui-collapsible-trigger-font-size",
7
8
  "--cui-collapsible-trigger-foreground",
8
9
  "--cui-collapsible-trigger-hover-foreground"
9
10
  ];
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/dropzone-knobs.d.ts
2
- export declare const dropzoneKnobs: readonly ["--cui-dropzone-surface-radius", "--cui-dropzone-surface-foreground", "--cui-dropzone-surface-border-color", "--cui-dropzone-surface-border-width", "--cui-dropzone-accept-border-color", "--cui-dropzone-reject-border-color", "--cui-dropzone-overlay-background"];
2
+ export declare const dropzoneKnobs: readonly ["--cui-dropzone-surface-radius", "--cui-dropzone-surface-foreground", "--cui-dropzone-surface-border-color", "--cui-dropzone-surface-border-width", "--cui-dropzone-accept-border-color", "--cui-dropzone-reject-border-color", "--cui-dropzone-overlay-background", "--cui-dropzone-surface-min-block-size", "--cui-dropzone-surface-padding-block", "--cui-dropzone-surface-padding-inline", "--cui-dropzone-surface-gap"];
3
3
  export type DropzoneKnobStyle = Partial<Record<(typeof dropzoneKnobs)[number], string>>;
4
4
  //#endregion
@@ -6,7 +6,11 @@ const dropzoneKnobs = [
6
6
  "--cui-dropzone-surface-border-width",
7
7
  "--cui-dropzone-accept-border-color",
8
8
  "--cui-dropzone-reject-border-color",
9
- "--cui-dropzone-overlay-background"
9
+ "--cui-dropzone-overlay-background",
10
+ "--cui-dropzone-surface-min-block-size",
11
+ "--cui-dropzone-surface-padding-block",
12
+ "--cui-dropzone-surface-padding-inline",
13
+ "--cui-dropzone-surface-gap"
10
14
  ];
11
15
  //#endregion
12
16
  export { dropzoneKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/field-knobs.d.ts
2
- export declare const fieldKnobs: readonly ["--cui-field-legend-font-size", "--cui-field-legend-font-weight", "--cui-field-radius", "--cui-field-background", "--cui-field-hover-background", "--cui-field-affordance-background", "--cui-field-affordance-shadow", "--cui-field-affordance-foreground", "--cui-field-affordance-hover-background", "--cui-field-foreground", "--cui-field-border-color", "--cui-field-border-width", "--cui-field-shadow", "--cui-field-backdrop-filter", "--cui-field-height", "--cui-field-padding-inline", "--cui-field-font-size", "--cui-field-font-weight", "--cui-field-font-family", "--cui-field-group-radius", "--cui-field-group-background", "--cui-field-group-border-color", "--cui-field-group-border-width", "--cui-field-group-shadow", "--cui-field-group-padding-block", "--cui-field-group-padding-inline", "--cui-field-group-separator-color", "--cui-field-group-separator-inset", "--cui-field-label-font-size", "--cui-field-label-font-weight", "--cui-field-description-font-size"];
2
+ export declare const fieldKnobs: readonly ["--cui-field-label-radius", "--cui-field-label-background", "--cui-field-label-hover-background", "--cui-field-label-checked-background", "--cui-field-label-border-color", "--cui-field-label-checked-border-color", "--cui-field-label-border-width", "--cui-field-label-padding-block", "--cui-field-label-padding-inline", "--cui-field-legend-font-size", "--cui-field-legend-font-weight", "--cui-field-radius", "--cui-field-background", "--cui-field-hover-background", "--cui-field-affordance-background", "--cui-field-affordance-shadow", "--cui-field-affordance-foreground", "--cui-field-affordance-hover-background", "--cui-field-foreground", "--cui-field-border-color", "--cui-field-border-width", "--cui-field-shadow", "--cui-field-backdrop-filter", "--cui-field-height", "--cui-field-padding-inline", "--cui-field-font-size", "--cui-field-font-weight", "--cui-field-font-family", "--cui-field-group-radius", "--cui-field-group-background", "--cui-field-group-border-color", "--cui-field-group-border-width", "--cui-field-group-shadow", "--cui-field-group-padding-block", "--cui-field-group-padding-inline", "--cui-field-group-separator-color", "--cui-field-group-separator-inset", "--cui-field-label-font-size", "--cui-field-label-font-weight", "--cui-field-description-font-size"];
3
3
  export type FieldKnobStyle = Partial<Record<(typeof fieldKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,5 +1,14 @@
1
1
  //#region src/knob-contracts/field-knobs.ts
2
2
  const fieldKnobs = [
3
+ "--cui-field-label-radius",
4
+ "--cui-field-label-background",
5
+ "--cui-field-label-hover-background",
6
+ "--cui-field-label-checked-background",
7
+ "--cui-field-label-border-color",
8
+ "--cui-field-label-checked-border-color",
9
+ "--cui-field-label-border-width",
10
+ "--cui-field-label-padding-block",
11
+ "--cui-field-label-padding-inline",
3
12
  "--cui-field-legend-font-size",
4
13
  "--cui-field-legend-font-weight",
5
14
  "--cui-field-radius",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/page-layout-knobs.d.ts
2
- export declare const pageLayoutKnobs: readonly ["--cui-page-layout-article-size", "--cui-page-layout-aside-size", "--cui-page-layout-padding-inline", "--cui-page-layout-padding-block", "--cui-page-layout-column-gap", "--cui-page-layout-header-start-gap", "--cui-page-layout-header-gap", "--cui-page-layout-header-column-gap", "--cui-page-layout-header-row-gap", "--cui-page-layout-size", "--cui-page-layout-sticky-gap", "--cui-page-layout-floating-inset", "--cui-page-layout-background", "--cui-page-layout-sticky-header-background", "--cui-page-layout-sticky-header-backdrop-filter"];
2
+ export declare const pageLayoutKnobs: readonly ["--cui-page-layout-article-size", "--cui-page-layout-aside-size", "--cui-page-layout-padding-inline", "--cui-page-layout-padding-block", "--cui-page-layout-column-gap", "--cui-page-layout-header-start-gap", "--cui-page-layout-header-gap", "--cui-page-layout-header-column-gap", "--cui-page-layout-title-font-size", "--cui-page-layout-header-row-gap", "--cui-page-layout-size", "--cui-page-layout-sticky-gap", "--cui-page-layout-floating-inset", "--cui-page-layout-background", "--cui-page-layout-sticky-header-background", "--cui-page-layout-sticky-header-backdrop-filter"];
3
3
  export type PageLayoutKnobStyle = Partial<Record<(typeof pageLayoutKnobs)[number], string>>;
4
4
  //#endregion
@@ -8,6 +8,7 @@ const pageLayoutKnobs = [
8
8
  "--cui-page-layout-header-start-gap",
9
9
  "--cui-page-layout-header-gap",
10
10
  "--cui-page-layout-header-column-gap",
11
+ "--cui-page-layout-title-font-size",
11
12
  "--cui-page-layout-header-row-gap",
12
13
  "--cui-page-layout-size",
13
14
  "--cui-page-layout-sticky-gap",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/popup-knobs.d.ts
2
- export declare const popupKnobs: readonly ["--cui-popup-title-foreground", "--cui-popup-title-font-size", "--cui-popup-title-font-weight", "--cui-popup-title-line-height", "--cui-popup-title-letter-spacing", "--cui-popup-description-foreground", "--cui-popup-close-inset", "--cui-popup-item-inset", "--cui-popup-label-padding-block", "--cui-popup-label-padding-inline", "--cui-popup-label-font-size", "--cui-popup-label-font-weight", "--cui-popup-label-letter-spacing", "--cui-popup-label-text-transform", "--cui-popup-separator-inset", "--cui-popup-shortcut-font-size", "--cui-popup-shortcut-letter-spacing", "--cui-popup-separator-gap", "--cui-popup-submenu-indicator-foreground", "--cui-popup-command-heading-padding-block", "--cui-popup-command-heading-padding-inline", "--cui-popup-command-heading-font-size", "--cui-popup-command-heading-letter-spacing", "--cui-popup-command-heading-text-transform", "--cui-popup-dialog-max-inline-size", "--cui-popup-tooltip-arrow-radius", "--cui-popup-status-success-foreground", "--cui-popup-status-warning-foreground", "--cui-popup-status-info-foreground", "--cui-popup-status-error-foreground", "--cui-popup-radius", "--cui-popup-background", "--cui-popup-foreground", "--cui-popup-border-color", "--cui-popup-border-width", "--cui-popup-shadow", "--cui-popup-backdrop-filter", "--cui-popup-backdrop-background", "--cui-popup-backdrop-blur", "--cui-popup-item-radius", "--cui-popup-item-font-size", "--cui-popup-item-icon-size", "--cui-popup-item-padding-block", "--cui-popup-item-padding-inline", "--cui-popup-item-min-height", "--cui-popup-item-highlight-shadow", "--cui-popup-item-foreground", "--cui-popup-item-highlight-background", "--cui-popup-item-highlight-foreground", "--cui-popup-item-highlight-muted-foreground", "--cui-popup-item-disabled-opacity", "--cui-popup-separator-color", "--cui-popup-shortcut-foreground"];
2
+ export declare const popupKnobs: readonly ["--cui-popup-title-foreground", "--cui-popup-title-font-size", "--cui-popup-title-font-weight", "--cui-popup-title-line-height", "--cui-popup-title-letter-spacing", "--cui-popup-description-foreground", "--cui-popup-description-font-size", "--cui-popup-close-inset", "--cui-popup-item-inset", "--cui-popup-label-padding-block", "--cui-popup-label-padding-inline", "--cui-popup-label-font-size", "--cui-popup-label-font-weight", "--cui-popup-label-letter-spacing", "--cui-popup-label-text-transform", "--cui-popup-separator-inset", "--cui-popup-shortcut-font-size", "--cui-popup-shortcut-letter-spacing", "--cui-popup-separator-gap", "--cui-popup-submenu-indicator-foreground", "--cui-popup-command-heading-padding-block", "--cui-popup-command-heading-padding-inline", "--cui-popup-command-heading-font-size", "--cui-popup-command-heading-letter-spacing", "--cui-popup-command-heading-text-transform", "--cui-popup-dialog-max-inline-size", "--cui-popup-shortcut-foreground", "--cui-popup-tooltip-arrow-radius", "--cui-popup-status-success-foreground", "--cui-popup-status-warning-foreground", "--cui-popup-status-info-foreground", "--cui-popup-status-error-foreground", "--cui-popup-radius", "--cui-popup-background", "--cui-popup-foreground", "--cui-popup-border-color", "--cui-popup-border-width", "--cui-popup-shadow", "--cui-popup-backdrop-filter", "--cui-popup-backdrop-background", "--cui-popup-backdrop-blur", "--cui-popup-item-radius", "--cui-popup-item-font-size", "--cui-popup-item-icon-size", "--cui-popup-item-padding-block", "--cui-popup-item-padding-inline", "--cui-popup-item-min-height", "--cui-popup-item-highlight-shadow", "--cui-popup-item-foreground", "--cui-popup-item-highlight-background", "--cui-popup-item-highlight-foreground", "--cui-popup-item-highlight-muted-foreground", "--cui-popup-item-disabled-opacity", "--cui-popup-separator-color"];
3
3
  export type PopupKnobStyle = Partial<Record<(typeof popupKnobs)[number], string>>;
4
4
  //#endregion
@@ -6,6 +6,7 @@ const popupKnobs = [
6
6
  "--cui-popup-title-line-height",
7
7
  "--cui-popup-title-letter-spacing",
8
8
  "--cui-popup-description-foreground",
9
+ "--cui-popup-description-font-size",
9
10
  "--cui-popup-close-inset",
10
11
  "--cui-popup-item-inset",
11
12
  "--cui-popup-label-padding-block",
@@ -25,6 +26,7 @@ const popupKnobs = [
25
26
  "--cui-popup-command-heading-letter-spacing",
26
27
  "--cui-popup-command-heading-text-transform",
27
28
  "--cui-popup-dialog-max-inline-size",
29
+ "--cui-popup-shortcut-foreground",
28
30
  "--cui-popup-tooltip-arrow-radius",
29
31
  "--cui-popup-status-success-foreground",
30
32
  "--cui-popup-status-warning-foreground",
@@ -51,8 +53,7 @@ const popupKnobs = [
51
53
  "--cui-popup-item-highlight-foreground",
52
54
  "--cui-popup-item-highlight-muted-foreground",
53
55
  "--cui-popup-item-disabled-opacity",
54
- "--cui-popup-separator-color",
55
- "--cui-popup-shortcut-foreground"
56
+ "--cui-popup-separator-color"
56
57
  ];
57
58
  //#endregion
58
59
  export { popupKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/sidebar-knobs.d.ts
2
- export declare const sidebarKnobs: readonly ["--cui-sidebar-nav-height", "--cui-sidebar-nav-background", "--cui-sidebar-nav-foreground", "--cui-sidebar-nav-border-color", "--cui-sidebar-nav-border-width", "--cui-sidebar-nav-shadow", "--cui-sidebar-nav-item-radius", "--cui-sidebar-nav-item-active-background", "--cui-sidebar-nav-item-active-foreground", "--cui-sidebar-nav-gap", "--cui-sidebar-menu-badge-height", "--cui-sidebar-menu-badge-background", "--cui-sidebar-menu-badge-foreground", "--cui-sidebar-header-border-width", "--cui-sidebar-header-border-color", "--cui-sidebar-rail-divider-background", "--cui-sidebar-wrapper-background", "--cui-sidebar-wrapper-background-image", "--cui-sidebar-inner-background", "--cui-sidebar-inner-border-color", "--cui-sidebar-inner-background-image", "--cui-sidebar-inner-backdrop-filter", "--cui-sidebar-inner-border-width", "--cui-sidebar-inner-radius", "--cui-sidebar-inner-shadow", "--cui-sidebar-header-background", "--cui-sidebar-header-shadow", "--cui-sidebar-inset-background", "--cui-sidebar-inset-background-image", "--cui-sidebar-inset-shadow", "--cui-sidebar-inset-border-color", "--cui-sidebar-inset-border-width", "--cui-sidebar-inset-radius", "--cui-sidebar-inset-inset", "--cui-sidebar-menu-button-radius", "--cui-sidebar-group-label-foreground", "--cui-sidebar-menu-button-foreground", "--cui-sidebar-menu-button-hover-background", "--cui-sidebar-menu-button-hover-foreground", "--cui-sidebar-menu-button-hover-shadow", "--cui-sidebar-menu-button-active-background", "--cui-sidebar-menu-button-active-foreground", "--cui-sidebar-menu-button-active-shadow", "--cui-sidebar-menu-button-track-active-foreground", "--cui-sidebar-menu-button-height", "--cui-sidebar-menu-button-padding-block", "--cui-sidebar-menu-button-padding-inline", "--cui-sidebar-menu-button-font-size", "--cui-sidebar-menu-button-font-weight", "--cui-sidebar-menu-button-active-font-weight", "--cui-sidebar-group-label-font-size", "--cui-sidebar-group-label-font-weight", "--cui-sidebar-group-label-letter-spacing", "--cui-sidebar-group-label-text-transform", "--cui-sidebar-group-label-padding", "--cui-sidebar-skip-link-background", "--cui-sidebar-skip-link-foreground", "--cui-sidebar-skip-link-radius", "--cui-sidebar-skip-link-shadow", "--cui-sidebar-menu-button-background", "--cui-sidebar-menu-button-shadow"];
2
+ export declare const sidebarKnobs: readonly ["--cui-sidebar-nav-height", "--cui-sidebar-nav-background", "--cui-sidebar-nav-foreground", "--cui-sidebar-nav-border-color", "--cui-sidebar-nav-border-width", "--cui-sidebar-nav-shadow", "--cui-sidebar-nav-item-radius", "--cui-sidebar-nav-item-active-background", "--cui-sidebar-nav-item-active-foreground", "--cui-sidebar-nav-gap", "--cui-sidebar-menu-badge-height", "--cui-sidebar-menu-badge-background", "--cui-sidebar-menu-badge-foreground", "--cui-sidebar-header-border-width", "--cui-sidebar-header-border-color", "--cui-sidebar-rail-divider-background", "--cui-sidebar-wrapper-background", "--cui-sidebar-wrapper-background-image", "--cui-sidebar-inner-background", "--cui-sidebar-inner-border-color", "--cui-sidebar-inner-background-image", "--cui-sidebar-inner-backdrop-filter", "--cui-sidebar-container-border-width", "--cui-sidebar-inner-border-width", "--cui-sidebar-inner-radius", "--cui-sidebar-inner-shadow", "--cui-sidebar-header-background", "--cui-sidebar-header-shadow", "--cui-sidebar-inset-background", "--cui-sidebar-inset-background-image", "--cui-sidebar-inset-shadow", "--cui-sidebar-inset-border-color", "--cui-sidebar-inset-border-width", "--cui-sidebar-inset-radius", "--cui-sidebar-inset-inset", "--cui-sidebar-menu-button-radius", "--cui-sidebar-group-label-foreground", "--cui-sidebar-menu-button-foreground", "--cui-sidebar-menu-button-hover-background", "--cui-sidebar-menu-button-hover-foreground", "--cui-sidebar-menu-button-hover-shadow", "--cui-sidebar-menu-button-active-background", "--cui-sidebar-menu-button-active-foreground", "--cui-sidebar-menu-button-active-shadow", "--cui-sidebar-menu-button-track-active-foreground", "--cui-sidebar-menu-button-height", "--cui-sidebar-menu-button-padding-block", "--cui-sidebar-menu-button-padding-inline", "--cui-sidebar-menu-button-font-size", "--cui-sidebar-menu-button-font-weight", "--cui-sidebar-menu-button-active-font-weight", "--cui-sidebar-group-label-font-size", "--cui-sidebar-group-label-font-weight", "--cui-sidebar-group-label-letter-spacing", "--cui-sidebar-group-label-text-transform", "--cui-sidebar-group-label-padding", "--cui-sidebar-skip-link-background", "--cui-sidebar-skip-link-foreground", "--cui-sidebar-skip-link-radius", "--cui-sidebar-skip-link-shadow", "--cui-sidebar-menu-button-background", "--cui-sidebar-menu-button-shadow"];
3
3
  export type SidebarKnobStyle = Partial<Record<(typeof sidebarKnobs)[number], string>>;
4
4
  //#endregion
@@ -22,6 +22,7 @@ const sidebarKnobs = [
22
22
  "--cui-sidebar-inner-border-color",
23
23
  "--cui-sidebar-inner-background-image",
24
24
  "--cui-sidebar-inner-backdrop-filter",
25
+ "--cui-sidebar-container-border-width",
25
26
  "--cui-sidebar-inner-border-width",
26
27
  "--cui-sidebar-inner-radius",
27
28
  "--cui-sidebar-inner-shadow",
@@ -1,5 +1,5 @@
1
- import { AsYouType } from "libphonenumber-js/max";
2
1
  import { getCountryCallingCode } from "react-phone-number-input/max";
2
+ import { AsYouType } from "libphonenumber-js/max";
3
3
  //#region src/lib/phone-input-format.ts
4
4
  function normalizePhoneInputText(value, country) {
5
5
  if (!country) return value;
@@ -19,6 +19,7 @@
19
19
  --cui-avatar-fallback-background: var(--muted);
20
20
  --cui-avatar-fallback-foreground: var(--muted-foreground);
21
21
  border-radius: var(--cui-avatar-radius);
22
+ container-type: inline-size;
22
23
  }
23
24
 
24
25
  :where([data-control-family="avatar"][data-slot="root"])::after {
@@ -80,6 +81,7 @@
80
81
  border-radius: inherit;
81
82
  background: var(--cui-avatar-fallback-background);
82
83
  color: var(--cui-avatar-fallback-foreground);
84
+ font-size: max(var(--text-micro), 37.5cqi);
83
85
  font-weight: var(--font-weight-medium);
84
86
  }
85
87
  }
@@ -4,6 +4,7 @@
4
4
  background-color: var(--cui-button-hover-background);
5
5
  background-image: var(--cui-button-hover-background-image);
6
6
  box-shadow: var(--cui-button-hover-shadow);
7
+ border-color: var(--cui-button-hover-border-color);
7
8
  color: var(--cui-button-hover-foreground);
8
9
  }
9
10
  }
@@ -12,6 +13,7 @@
12
13
  background-color: var(--cui-button-open-background);
13
14
  color: var(--cui-button-open-foreground);
14
15
  box-shadow: var(--cui-button-open-shadow);
16
+ border-color: var(--cui-button-open-border-color);
15
17
  }
16
18
 
17
19
  :where([data-control-family="button"][data-active="true"]) {
@@ -82,3 +84,44 @@
82
84
  }
83
85
  }
84
86
  }
87
+
88
+ @property --cui-button-press-background {
89
+ syntax: "<color>";
90
+ inherits: true;
91
+ initial-value: transparent;
92
+ }
93
+
94
+ @property --cui-button-press-scale {
95
+ syntax: "<number>";
96
+ inherits: true;
97
+ initial-value: 1;
98
+ }
99
+
100
+ @property --cui-button-hover-border-color {
101
+ syntax: "<color>";
102
+ inherits: true;
103
+ initial-value: transparent;
104
+ }
105
+
106
+ @property --cui-button-open-border-color {
107
+ syntax: "<color>";
108
+ inherits: true;
109
+ initial-value: transparent;
110
+ }
111
+
112
+ @property --cui-button-open-background {
113
+ syntax: "<color>";
114
+ inherits: true;
115
+ initial-value: transparent;
116
+ }
117
+
118
+ @property --cui-button-open-foreground {
119
+ syntax: "<color>";
120
+ inherits: true;
121
+ initial-value: transparent;
122
+ }
123
+
124
+ @property --cui-button-open-shadow {
125
+ syntax: "*";
126
+ inherits: true;
127
+ }
@@ -29,6 +29,7 @@
29
29
  --cui-button-icon: 1rem;
30
30
  --cui-button-height: var(--control-h-md);
31
31
  --cui-button-padding-inline: var(--padding-x);
32
+ --cui-button-padding-block: calc(var(--spacing) * 1.5);
32
33
  --cui-button-icon-padding-inline: max(0px, calc(var(--cui-button-padding-inline) - var(--spacing) * 0.5));
33
34
  --cui-button-font-size: var(--text-body);
34
35
  --cui-button-font-weight: var(--font-weight-medium);
@@ -50,6 +51,12 @@
50
51
  --cui-button-open-background: var(--cui-button-hover-background);
51
52
  --cui-button-open-foreground: var(--cui-button-hover-foreground);
52
53
  --cui-button-open-shadow: var(--cui-button-shadow);
54
+ --cui-button-border-width: 0px;
55
+ --cui-button-border-style: solid;
56
+ --cui-button-border-color: var(--control-rim);
57
+ --cui-button-hover-border-color: var(--cui-button-border-color);
58
+ --cui-button-open-border-color: var(--cui-button-hover-border-color);
59
+ border: var(--cui-button-border-width) var(--cui-button-border-style) var(--cui-button-border-color);
53
60
  border-radius: var(--cui-button-radius);
54
61
  background-color: var(--cui-button-background);
55
62
  background-image: var(--cui-button-background-image);
@@ -130,7 +137,7 @@
130
137
  --cui-button-radius: var(--nest-radius, min(var(--radius-control), var(--radius-field)));
131
138
  flex-direction: column;
132
139
  block-size: auto;
133
- padding-block: calc(var(--spacing) * 1.5);
140
+ padding-block: var(--cui-button-padding-block);
134
141
  padding-inline: var(--cui-button-padding-inline);
135
142
  }
136
143
 
@@ -179,6 +186,13 @@
179
186
  --cui-button-active-hover-background: oklch(from var(--primary) l c h / 0.1);
180
187
  }
181
188
 
189
+ :where([data-control-family="button"][data-variant="dashed"]) {
190
+ --cui-button-border-width: var(--control-rim-width);
191
+ --cui-button-border-style: dashed;
192
+ --cui-button-hover-border-color: oklch(from var(--foreground) l c h / 0.4);
193
+ --cui-button-hover-background: transparent;
194
+ }
195
+
182
196
  :where([data-control-family="button"]:is([data-variant="surface"], [data-variant="ghost"], [data-variant="quiet"])) {
183
197
  --cui-button-open-background: oklch(from var(--foreground) l c h / 0.07);
184
198
  }
@@ -267,6 +281,12 @@
267
281
  initial-value: 0px;
268
282
  }
269
283
 
284
+ @property --cui-button-padding-block {
285
+ syntax: "<length-percentage>";
286
+ inherits: true;
287
+ initial-value: 0px;
288
+ }
289
+
270
290
  @property --cui-button-icon-padding-inline {
271
291
  syntax: "<length-percentage>";
272
292
  inherits: true;
@@ -319,18 +339,6 @@
319
339
  initial-value: transparent;
320
340
  }
321
341
 
322
- @property --cui-button-press-background {
323
- syntax: "<color>";
324
- inherits: true;
325
- initial-value: transparent;
326
- }
327
-
328
- @property --cui-button-press-scale {
329
- syntax: "<number>";
330
- inherits: true;
331
- initial-value: 1;
332
- }
333
-
334
342
  @property --cui-button-active-background {
335
343
  syntax: "<color>";
336
344
  inherits: true;
@@ -369,19 +377,19 @@
369
377
  inherits: true;
370
378
  }
371
379
 
372
- @property --cui-button-open-background {
373
- syntax: "<color>";
380
+ @property --cui-button-border-width {
381
+ syntax: "<length>";
374
382
  inherits: true;
375
- initial-value: transparent;
383
+ initial-value: 0px;
376
384
  }
377
385
 
378
- @property --cui-button-open-foreground {
379
- syntax: "<color>";
386
+ @property --cui-button-border-style {
387
+ syntax: "*";
380
388
  inherits: true;
381
- initial-value: transparent;
382
389
  }
383
390
 
384
- @property --cui-button-open-shadow {
385
- syntax: "*";
391
+ @property --cui-button-border-color {
392
+ syntax: "<color>";
386
393
  inherits: true;
394
+ initial-value: transparent;
387
395
  }
@@ -6,6 +6,7 @@
6
6
  --cui-collapsible-trigger-padding-block: 0px;
7
7
  --cui-collapsible-trigger-foreground: var(--foreground);
8
8
  --cui-collapsible-trigger-hover-foreground: var(--foreground);
9
+ --cui-collapsible-trigger-font-size: var(--text-label);
9
10
  }
10
11
 
11
12
  :where([data-control-family="collapsible"][data-slot="trigger"]) {
@@ -18,7 +19,7 @@
18
19
  padding-block: var(--cui-collapsible-trigger-padding-block);
19
20
  padding-inline: var(--cui-collapsible-trigger-padding-inline);
20
21
  color: var(--cui-collapsible-trigger-foreground);
21
- font-size: var(--text-label);
22
+ font-size: var(--cui-collapsible-trigger-font-size);
22
23
  font-weight: var(--font-weight-medium);
23
24
  text-align: start;
24
25
  transition: background-color var(--duration-fast) var(--ease-standard);
@@ -99,6 +100,12 @@
99
100
  initial-value: 0px;
100
101
  }
101
102
 
103
+ @property --cui-collapsible-trigger-font-size {
104
+ syntax: "<length-percentage>";
105
+ inherits: true;
106
+ initial-value: 0px;
107
+ }
108
+
102
109
  @property --cui-collapsible-trigger-foreground {
103
110
  syntax: "<color>";
104
111
  inherits: true;
@@ -7,7 +7,19 @@
7
7
  --cui-dropzone-accept-border-color: var(--primary);
8
8
  --cui-dropzone-reject-border-color: var(--destructive);
9
9
  --cui-dropzone-overlay-background: oklch(from var(--card) l c h / 0.95);
10
+ --cui-dropzone-surface-min-block-size: calc(var(--spacing) * 32);
11
+ --cui-dropzone-surface-padding-block: calc(var(--spacing) * 6);
12
+ --cui-dropzone-surface-padding-inline: calc(var(--spacing) * 6);
13
+ --cui-dropzone-surface-gap: calc(var(--spacing) * 3);
10
14
  }
15
+
16
+ :where([data-control-family="dropzone"][data-slot="root"][data-size="sm"]) {
17
+ --cui-dropzone-surface-min-block-size: var(--control-h-md);
18
+ --cui-dropzone-surface-padding-block: calc(var(--spacing) * 2);
19
+ --cui-dropzone-surface-padding-inline: calc(var(--spacing) * 3);
20
+ --cui-dropzone-surface-gap: calc(var(--spacing) * 2);
21
+ }
22
+
11
23
  :where([data-control-family="dropzone"][data-slot="trigger"]),
12
24
  :where([data-control-family="dropzone"][data-slot="overlay"]) {
13
25
  border: var(--cui-dropzone-surface-border-width) dashed var(--cui-dropzone-surface-border-color);
@@ -16,16 +28,22 @@
16
28
  }
17
29
 
18
30
  :where([data-control-family="dropzone"][data-slot="trigger"]) {
19
- min-block-size: calc(var(--spacing) * 32);
20
- gap: calc(var(--spacing) * 3);
21
- padding: calc(var(--spacing) * 6);
31
+ min-block-size: var(--cui-dropzone-surface-min-block-size);
32
+ gap: var(--cui-dropzone-surface-gap);
33
+ padding-block: var(--cui-dropzone-surface-padding-block);
34
+ padding-inline: var(--cui-dropzone-surface-padding-inline);
22
35
  background-color: var(--card);
36
+ font-size: var(--text-body);
23
37
  text-align: center;
24
38
  transition-property: border-color, color, opacity, box-shadow;
25
39
  transition-duration: var(--duration-fast);
26
40
  transition-timing-function: var(--ease-standard);
27
41
  }
28
42
 
43
+ :where([data-control-family="dropzone"][data-slot="root"][data-size="sm"] [data-control-family="dropzone"][data-slot="trigger"]) {
44
+ text-align: start;
45
+ }
46
+
29
47
  @media (hover: hover) {
30
48
  :where([data-control-family="dropzone"][data-slot="trigger"]:hover:not(:disabled, [aria-disabled="true"])) {
31
49
  background-color: oklch(from var(--muted) l c h / 0.5);
@@ -53,7 +71,8 @@
53
71
  }
54
72
 
55
73
  :where([data-control-family="dropzone"][data-slot="overlay"]) {
56
- padding: calc(var(--spacing) * 6);
74
+ padding-block: var(--cui-dropzone-surface-padding-block);
75
+ padding-inline: var(--cui-dropzone-surface-padding-inline);
57
76
  border-style: solid;
58
77
  background-color: var(--cui-dropzone-overlay-background);
59
78
  opacity: 0;
@@ -153,3 +172,27 @@
153
172
  inherits: true;
154
173
  initial-value: transparent;
155
174
  }
175
+
176
+ @property --cui-dropzone-surface-min-block-size {
177
+ syntax: "<length-percentage>";
178
+ inherits: true;
179
+ initial-value: 0px;
180
+ }
181
+
182
+ @property --cui-dropzone-surface-padding-block {
183
+ syntax: "<length-percentage>";
184
+ inherits: true;
185
+ initial-value: 0px;
186
+ }
187
+
188
+ @property --cui-dropzone-surface-padding-inline {
189
+ syntax: "<length-percentage>";
190
+ inherits: true;
191
+ initial-value: 0px;
192
+ }
193
+
194
+ @property --cui-dropzone-surface-gap {
195
+ syntax: "<length-percentage>";
196
+ inherits: true;
197
+ initial-value: 0px;
198
+ }
@@ -181,6 +181,36 @@
181
181
  opacity: var(--disabled-opacity);
182
182
  }
183
183
 
184
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="label"][data-variant="card"]) {
185
+ padding-block: var(--cui-field-label-padding-block);
186
+ padding-inline: var(--cui-field-label-padding-inline);
187
+ border: var(--cui-field-label-border-width) solid var(--cui-field-label-border-color);
188
+ border-radius: var(--cui-field-label-radius);
189
+ background-color: var(--cui-field-label-background);
190
+ transition-property: background-color, border-color;
191
+ transition-duration: var(--duration-fast);
192
+ transition-timing-function: var(--ease-standard);
193
+ }
194
+
195
+ @media (hover: hover) {
196
+ :where(
197
+ [data-control-family="field"][data-field-kind="field"][data-slot="label"][data-variant="card"]:hover:not(
198
+ :has([data-control-family="choice"]:is([data-checked], [data-disabled]))
199
+ )
200
+ ) {
201
+ background-color: var(--cui-field-label-hover-background);
202
+ }
203
+ }
204
+
205
+ :where(
206
+ [data-control-family="field"][data-field-kind="field"][data-slot="label"][data-variant="card"]:has(
207
+ [data-control-family="choice"][data-checked]
208
+ )
209
+ ) {
210
+ border-color: var(--cui-field-label-checked-border-color);
211
+ background-color: var(--cui-field-label-checked-background);
212
+ }
213
+
184
214
  :where([data-control-family="field"][data-field-kind="field"][data-slot="description"]) {
185
215
  color: var(--muted-foreground);
186
216
  font-size: var(--cui-field-description-font-size);
@@ -212,6 +242,15 @@
212
242
  :where([data-control-family="field"][data-field-kind="field"]) {
213
243
  --cui-field-legend-font-size: var(--text-label);
214
244
  --cui-field-legend-font-weight: var(--font-weight-semibold);
245
+ --cui-field-label-radius: var(--radius-lg);
246
+ --cui-field-label-background: transparent;
247
+ --cui-field-label-hover-background: var(--hover-fill);
248
+ --cui-field-label-checked-background: oklch(from var(--primary) l c h / 0.06);
249
+ --cui-field-label-border-color: var(--border);
250
+ --cui-field-label-checked-border-color: var(--primary);
251
+ --cui-field-label-border-width: var(--control-rim-width);
252
+ --cui-field-label-padding-block: calc(var(--spacing) * 3);
253
+ --cui-field-label-padding-inline: calc(var(--spacing) * 3);
215
254
  }
216
255
 
217
256
  :where([data-control-family="field"][data-field-kind="field"][data-slot="legend"]) {
@@ -275,6 +314,60 @@
275
314
  }
276
315
  }
277
316
 
317
+ @property --cui-field-label-radius {
318
+ syntax: "<length-percentage>";
319
+ inherits: true;
320
+ initial-value: 0px;
321
+ }
322
+
323
+ @property --cui-field-label-background {
324
+ syntax: "<color>";
325
+ inherits: true;
326
+ initial-value: transparent;
327
+ }
328
+
329
+ @property --cui-field-label-hover-background {
330
+ syntax: "<color>";
331
+ inherits: true;
332
+ initial-value: transparent;
333
+ }
334
+
335
+ @property --cui-field-label-checked-background {
336
+ syntax: "<color>";
337
+ inherits: true;
338
+ initial-value: transparent;
339
+ }
340
+
341
+ @property --cui-field-label-border-color {
342
+ syntax: "<color>";
343
+ inherits: true;
344
+ initial-value: transparent;
345
+ }
346
+
347
+ @property --cui-field-label-checked-border-color {
348
+ syntax: "<color>";
349
+ inherits: true;
350
+ initial-value: transparent;
351
+ }
352
+
353
+ @property --cui-field-label-border-width {
354
+ syntax: "<length>";
355
+ inherits: true;
356
+ initial-value: 0px;
357
+ }
358
+
359
+ @property --cui-field-label-padding-block {
360
+ syntax: "<length-percentage>";
361
+ inherits: true;
362
+ initial-value: 0px;
363
+ }
364
+
365
+ @property --cui-field-label-padding-inline {
366
+ syntax: "<length-percentage>";
367
+ inherits: true;
368
+ initial-value: 0px;
369
+ }
370
+
278
371
  @property --cui-field-legend-font-size {
279
372
  syntax: "<length-percentage>";
280
373
  inherits: true;