@ctrl-ui/react 0.9.11 → 0.9.13

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 (69) hide show
  1. package/README.md +3 -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/dropzone-knobs.d.ts +1 -1
  7. package/dist/knob-contracts/dropzone-knobs.js +5 -1
  8. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  9. package/dist/knob-contracts/field-knobs.js +10 -0
  10. package/dist/knob-contracts/gradient-editor-knobs.d.ts +1 -1
  11. package/dist/knob-contracts/gradient-editor-knobs.js +1 -4
  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 +5 -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/styles/recipes/avatar.css +2 -0
  19. package/dist/styles/recipes/button-states.css +43 -0
  20. package/dist/styles/recipes/button.css +29 -21
  21. package/dist/styles/recipes/card.css +8 -0
  22. package/dist/styles/recipes/color-picker-values.css +4 -18
  23. package/dist/styles/recipes/color-picker.css +3 -4
  24. package/dist/styles/recipes/dropzone.css +47 -4
  25. package/dist/styles/recipes/field-parts.css +101 -1
  26. package/dist/styles/recipes/gradient-editor.css +3 -47
  27. package/dist/styles/recipes/markdown.css +5 -1
  28. package/dist/styles/recipes/page-layout.css +8 -1
  29. package/dist/styles/recipes/popup-controls.css +7 -1
  30. package/dist/styles/recipes/popup-lists.css +30 -5
  31. package/dist/styles/recipes/popup.css +5 -6
  32. package/dist/styles/recipes/sidebar-parts.css +6 -0
  33. package/dist/styles/recipes/sidebar.css +9 -8
  34. package/dist/styles/recipes/table.css +29 -0
  35. package/dist/styles/theme.css +4 -0
  36. package/dist/ui/autocomplete.d.ts +3 -0
  37. package/dist/ui/autocomplete.js +17 -2
  38. package/dist/ui/chart-cartesian.d.ts +60 -57
  39. package/dist/ui/chart-cartesian.js +7 -7
  40. package/dist/ui/chart-colors.d.ts +4 -2
  41. package/dist/ui/chart-colors.js +6 -2
  42. package/dist/ui/chart-marks.d.ts +4 -4
  43. package/dist/ui/chart-marks.js +14 -5
  44. package/dist/ui/chart-series.d.ts +9 -6
  45. package/dist/ui/chart-series.js +3 -2
  46. package/dist/ui/color-picker-swatches.d.ts +4 -3
  47. package/dist/ui/color-picker-swatches.js +7 -8
  48. package/dist/ui/command.d.ts +12 -0
  49. package/dist/ui/command.js +32 -2
  50. package/dist/ui/dropzone.d.ts +4 -1
  51. package/dist/ui/dropzone.js +16 -8
  52. package/dist/ui/field.d.ts +4 -1
  53. package/dist/ui/field.js +4 -2
  54. package/dist/ui/gradient-editor.d.ts +3 -2
  55. package/dist/ui/gradient-editor.js +7 -8
  56. package/dist/ui/markdown-components.d.ts +27 -0
  57. package/dist/ui/markdown-components.js +57 -0
  58. package/dist/ui/markdown-elements.d.ts +6 -25
  59. package/dist/ui/markdown-elements.js +19 -53
  60. package/dist/ui/markdown.d.ts +2 -7
  61. package/dist/ui/markdown.js +3 -20
  62. package/dist/ui/table.d.ts +6 -0
  63. package/dist/ui/table.js +17 -1
  64. package/lint/class-policy.mjs +31 -1
  65. package/lint/eslint-plugin.mjs +48 -4
  66. package/lint/grit-rules.mjs +52 -11
  67. package/lint/no-component-style-classes.grit +41 -6
  68. package/lint/no-raw-type-classes.grit +1 -1
  69. package/package.json +5 -1
package/README.md CHANGED
@@ -51,9 +51,11 @@ 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
+ The Biome rules need Biome 2.4.11 or later; older versions fail with "Failed to compile the Grit plugin".
58
+
57
59
  Biome, extending the shipped preset so rules added later arrive with the package update:
58
60
 
59
61
  ```json
@@ -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/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-foreground", "--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,15 @@
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",
12
+ "--cui-field-legend-foreground",
3
13
  "--cui-field-legend-font-size",
4
14
  "--cui-field-legend-font-weight",
5
15
  "--cui-field-radius",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/gradient-editor-knobs.d.ts
2
- export declare const gradientEditorKnobs: readonly ["--cui-gradient-editor-preview-radius", "--cui-gradient-editor-preview-ring-color", "--cui-gradient-editor-track-radius", "--cui-gradient-editor-stop-radius", "--cui-gradient-editor-stop-border-color", "--cui-gradient-editor-stop-border-width", "--cui-gradient-editor-stop-shadow", "--cui-gradient-editor-add-radius", "--cui-gradient-editor-add-border-color", "--cui-gradient-editor-add-border-width"];
2
+ export declare const gradientEditorKnobs: readonly ["--cui-gradient-editor-preview-radius", "--cui-gradient-editor-preview-ring-color", "--cui-gradient-editor-track-radius", "--cui-gradient-editor-stop-radius", "--cui-gradient-editor-stop-border-color", "--cui-gradient-editor-stop-border-width", "--cui-gradient-editor-stop-shadow"];
3
3
  export type GradientEditorKnobStyle = Partial<Record<(typeof gradientEditorKnobs)[number], string>>;
4
4
  //#endregion
@@ -6,10 +6,7 @@ const gradientEditorKnobs = [
6
6
  "--cui-gradient-editor-stop-radius",
7
7
  "--cui-gradient-editor-stop-border-color",
8
8
  "--cui-gradient-editor-stop-border-width",
9
- "--cui-gradient-editor-stop-shadow",
10
- "--cui-gradient-editor-add-radius",
11
- "--cui-gradient-editor-add-border-color",
12
- "--cui-gradient-editor-add-border-width"
9
+ "--cui-gradient-editor-stop-shadow"
13
10
  ];
14
11
  //#endregion
15
12
  export { gradientEditorKnobs };
@@ -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-item-description-foreground", "--cui-popup-item-description-font-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,9 @@ 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-item-description-foreground",
30
+ "--cui-popup-item-description-font-size",
31
+ "--cui-popup-shortcut-foreground",
28
32
  "--cui-popup-tooltip-arrow-radius",
29
33
  "--cui-popup-status-success-foreground",
30
34
  "--cui-popup-status-warning-foreground",
@@ -51,8 +55,7 @@ const popupKnobs = [
51
55
  "--cui-popup-item-highlight-foreground",
52
56
  "--cui-popup-item-highlight-muted-foreground",
53
57
  "--cui-popup-item-disabled-opacity",
54
- "--cui-popup-separator-color",
55
- "--cui-popup-shortcut-foreground"
58
+ "--cui-popup-separator-color"
56
59
  ];
57
60
  //#endregion
58
61
  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",
@@ -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
  }
@@ -63,6 +63,14 @@
63
63
  border-radius: var(--cui-card-radius);
64
64
  }
65
65
 
66
+ :where(
67
+ [data-control-family="card"][data-slot="root"]:has([data-control-family="card"][data-slot="link"])
68
+ :is(a[href], button, input, select, textarea, [role="checkbox"]):not([data-control-family="card"][data-slot="link"])
69
+ ) {
70
+ position: relative;
71
+ z-index: 1;
72
+ }
73
+
66
74
  :where([data-control-family="card"][data-slot="root"][data-size="sm"]) {
67
75
  --cui-card-padding-block: calc(var(--spacing) * 3);
68
76
  --cui-card-padding-inline: calc(var(--spacing) * 4);
@@ -53,23 +53,9 @@
53
53
  font-size: var(--text-caption);
54
54
  }
55
55
 
56
- :where([data-control-family="color-picker"][data-slot="swatch-add"]) {
57
- border-radius: var(--radius-md);
58
- border-width: var(--control-rim-width);
59
- border-style: dashed;
60
- --_color-picker-swatch-add-border-color: var(--border);
61
- border-color: var(--_color-picker-swatch-add-border-color);
62
- --_color-picker-swatch-add-foreground: var(--muted-foreground);
63
- color: var(--_color-picker-swatch-add-foreground);
64
- }
65
-
66
- @media (hover: hover) {
67
- :where([data-control-family="color-picker"][data-slot="swatch-add"]:hover:not(:disabled)) {
68
- --_color-picker-swatch-add-border-color: oklch(from var(--foreground) l c h / 0.4);
69
- border-color: var(--_color-picker-swatch-add-border-color);
70
- --_color-picker-swatch-add-foreground: var(--foreground);
71
- color: var(--_color-picker-swatch-add-foreground);
72
- }
56
+ :where([data-control-family="button"][data-color-picker-swatch-add="true"]) {
57
+ --nest-radius: var(--radius-md);
58
+ --cui-button-height: calc(var(--spacing) * 6);
73
59
  }
74
60
 
75
61
  :where([data-control-family="color-picker"][data-slot="swatch"]) {
@@ -91,7 +77,7 @@
91
77
  transition: box-shadow var(--duration-fast) var(--ease-standard);
92
78
  }
93
79
 
94
- :where([data-control-family="color-picker"]:is([data-slot="swatch"], [data-slot="swatch-add"], [data-slot="contrast-fix"]):disabled) {
80
+ :where([data-control-family="color-picker"]:is([data-slot="swatch"], [data-slot="contrast-fix"]):disabled) {
95
81
  opacity: var(--disabled-opacity);
96
82
  }
97
83
 
@@ -59,8 +59,7 @@
59
59
  border-radius: 9999px;
60
60
  }
61
61
 
62
- :where([data-control-family="color-picker"][data-slot="swatch"]),
63
- :where([data-control-family="color-picker"][data-slot="swatch-add"]) {
62
+ :where([data-control-family="color-picker"][data-slot="swatch"]) {
64
63
  inline-size: calc(var(--spacing) * 6);
65
64
  block-size: calc(var(--spacing) * 6);
66
65
  }
@@ -125,7 +124,7 @@
125
124
  --_color-picker-thumb-elevation: var(--shadow-md);
126
125
  }
127
126
 
128
- :where([data-control-family="color-picker"]:is([data-slot="slider-thumb"], [data-slot="swatch-add"]))::after {
127
+ :where([data-control-family="color-picker"][data-slot="slider-thumb"])::after {
129
128
  content: "";
130
129
  position: absolute;
131
130
  inset: 50%;
@@ -135,7 +134,7 @@
135
134
  }
136
135
 
137
136
  @media (pointer: coarse) {
138
- :where([data-control-family="color-picker"]:is([data-slot="slider-thumb"], [data-slot="swatch-add"]))::after {
137
+ :where([data-control-family="color-picker"][data-slot="slider-thumb"])::after {
139
138
  inline-size: max(100%, var(--touch-target));
140
139
  block-size: max(100%, var(--touch-target));
141
140
  }
@@ -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
+ }