@ladder-ui/checkbox 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/checkbox.css CHANGED
@@ -1,88 +1 @@
1
- @layer components {
2
- .lui-checkbox {
3
- position: relative;
4
- display: inline-flex;
5
- align-items: center;
6
- justify-content: center;
7
- flex-shrink: 0;
8
- vertical-align: middle;
9
- width: var(--lui-checkbox-size-md);
10
- height: var(--lui-checkbox-size-md);
11
- }
12
- .lui-checkbox__input {
13
- position: absolute;
14
- inset: 0;
15
- width: 100%;
16
- height: 100%;
17
- margin: 0;
18
- padding: 0;
19
- opacity: 0;
20
- cursor: pointer;
21
- z-index: 1;
22
- }
23
- .lui-checkbox__input:disabled {
24
- cursor: not-allowed;
25
- }
26
- .lui-checkbox__control {
27
- display: flex;
28
- align-items: center;
29
- justify-content: center;
30
- width: 100%;
31
- height: 100%;
32
- background-color: var(--lui-checkbox-bg);
33
- border: 1px solid var(--lui-checkbox-border);
34
- border-radius: var(--lui-checkbox-radius);
35
- color: var(--lui-checkbox-checked-text);
36
- transition: var(--lui-transition);
37
- pointer-events: none;
38
- flex-shrink: 0;
39
- }
40
- .lui-checkbox__icon {
41
- display: none;
42
- align-items: center;
43
- justify-content: center;
44
- width: 65%;
45
- height: 65%;
46
- }
47
- .lui-checkbox__icon svg {
48
- width: 100%;
49
- height: 100%;
50
- }
51
- .lui-checkbox:has(.lui-checkbox__input:focus-visible) .lui-checkbox__control {
52
- outline: none;
53
- border-color: var(--lui-checkbox-focus-border);
54
- box-shadow: 0 0 0 2px var(--lui-surface), 0 0 0 4px var(--lui-checkbox-focus-ring-color);
55
- }
56
- .lui-checkbox:has(.lui-checkbox__input:checked:not(:indeterminate)) .lui-checkbox__control {
57
- background-color: var(--lui-checkbox-checked-bg);
58
- border-color: var(--lui-checkbox-checked-bg);
59
- }
60
- .lui-checkbox:has(.lui-checkbox__input:checked:not(:indeterminate)) .lui-checkbox__icon--check {
61
- display: flex;
62
- }
63
- .lui-checkbox:has(.lui-checkbox__input:indeterminate) .lui-checkbox__control {
64
- background-color: var(--lui-checkbox-checked-bg);
65
- border-color: var(--lui-checkbox-checked-bg);
66
- }
67
- .lui-checkbox:has(.lui-checkbox__input:indeterminate) .lui-checkbox__icon--indeterminate {
68
- display: flex;
69
- }
70
- .lui-checkbox:has(.lui-checkbox__input:disabled) {
71
- opacity: var(--lui-disabled-opacity);
72
- }
73
- .lui-checkbox--error .lui-checkbox__control {
74
- border-color: var(--lui-error);
75
- }
76
- .lui-checkbox--error:has(.lui-checkbox__input:focus-visible) .lui-checkbox__control {
77
- border-color: var(--lui-error);
78
- box-shadow: 0 0 0 2px var(--lui-surface), 0 0 0 4px color-mix(in srgb, var(--lui-error) 40%, transparent);
79
- }
80
- .lui-checkbox--sm {
81
- width: var(--lui-checkbox-size-sm);
82
- height: var(--lui-checkbox-size-sm);
83
- }
84
- .lui-checkbox--lg {
85
- width: var(--lui-checkbox-size-lg);
86
- height: var(--lui-checkbox-size-lg);
87
- }
88
- }
1
+ @layer components{.lui-checkbox{align-items:center;display:inline-flex;flex-shrink:0;height:var(--lui-checkbox-size-md);justify-content:center;position:relative;vertical-align:middle;width:var(--lui-checkbox-size-md)}.lui-checkbox__input{cursor:pointer;height:100%;inset:0;margin:0;opacity:0;padding:0;position:absolute;width:100%;z-index:1}.lui-checkbox__input:disabled{cursor:not-allowed}.lui-checkbox__control{align-items:center;background-color:var(--lui-checkbox-bg);border:1px solid var(--lui-checkbox-border);border-radius:var(--lui-checkbox-radius);color:var(--lui-checkbox-checked-text);display:flex;flex-shrink:0;height:100%;justify-content:center;pointer-events:none;transition:var(--lui-transition);width:100%}.lui-checkbox__icon{align-items:center;display:none;height:65%;justify-content:center;width:65%}.lui-checkbox__icon svg{height:100%;width:100%}.lui-checkbox:has(.lui-checkbox__input:focus-visible) .lui-checkbox__control{border-color:var(--lui-checkbox-focus-border);box-shadow:0 0 0 2px var(--lui-bg-surface),0 0 0 4px var(--lui-checkbox-focus-ring-color);outline:none}.lui-checkbox:has(.lui-checkbox__input:checked:not(:indeterminate)) .lui-checkbox__control{background-color:var(--lui-checkbox-checked-bg);border-color:var(--lui-checkbox-checked-bg)}.lui-checkbox:has(.lui-checkbox__input:checked:not(:indeterminate)) .lui-checkbox__icon--check{display:flex}.lui-checkbox:has(.lui-checkbox__input:indeterminate) .lui-checkbox__control{background-color:var(--lui-checkbox-checked-bg);border-color:var(--lui-checkbox-checked-bg)}.lui-checkbox:has(.lui-checkbox__input:indeterminate) .lui-checkbox__icon--indeterminate{display:flex}.lui-checkbox:has(.lui-checkbox__input:disabled){opacity:var(--lui-disabled-opacity)}.lui-checkbox--error .lui-checkbox__control{border-color:var(--lui-error)}.lui-checkbox--error:has(.lui-checkbox__input:focus-visible) .lui-checkbox__control{border-color:var(--lui-error);box-shadow:0 0 0 2px var(--lui-bg-surface),0 0 0 4px color-mix(in srgb,var(--lui-error) 40%,transparent)}.lui-checkbox--sm{height:var(--lui-checkbox-size-sm);width:var(--lui-checkbox-size-sm)}.lui-checkbox--lg{height:var(--lui-checkbox-size-lg);width:var(--lui-checkbox-size-lg)}}
@@ -27,10 +27,8 @@ export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputE
27
27
  * - Renders a native `<input type="checkbox">` for full browser and AT support.
28
28
  * - `ref` points directly to the native input element.
29
29
  * - Supports `indeterminate` state (shows a dash — useful for "select all" patterns).
30
- * - `status="error"` sets `aria-invalid="true"` automatically.
31
30
  * - No third-party dependencies — checkmark and dash are inline SVGs.
32
- * - All visual state (checked, indeterminate, focus, disabled, error) is driven by
33
- * CSS `:has()` selectors — zero JS involved in rendering.
31
+ * - All visual state is driven by CSS `:has()` selectors zero JS in rendering.
34
32
  */
35
33
  export declare function Checkbox({ ref, className, size, status, indeterminate, disabled, ...props }: CheckboxProps): import("react/jsx-runtime").JSX.Element;
36
34
  export declare namespace Checkbox {
@@ -1,17 +1 @@
1
- :root {
2
- /* Sizes */
3
- --lui-checkbox-size-sm: 0.875rem; /* 14px */
4
- --lui-checkbox-size-md: 1rem; /* 16px */
5
- --lui-checkbox-size-lg: 1.25rem; /* 20px */
6
- /* Background & border (unchecked) */
7
- --lui-checkbox-bg: var(--lui-surface);
8
- --lui-checkbox-border: color-mix(in srgb, var(--lui-surface-border) 93%, var(--lui-surface-text));
9
- /* Checked & indeterminate */
10
- --lui-checkbox-checked-bg: var(--lui-primary);
11
- --lui-checkbox-checked-text: var(--lui-primary-text);
12
- /* Focus ring */
13
- --lui-checkbox-focus-border: var(--lui-primary);
14
- --lui-checkbox-focus-ring-color: color-mix(in srgb, var(--lui-primary) 40%, transparent);
15
- /* Shape */
16
- --lui-checkbox-radius: var(--lui-radius-sm);
17
- }
1
+ :root{--lui-checkbox-size-sm:0.875rem;--lui-checkbox-size-md:1rem;--lui-checkbox-size-lg:1.25rem;--lui-checkbox-bg:var(--lui-bg-surface);--lui-checkbox-border:color-mix(in srgb,var(--lui-border-default) 93%,var(--lui-text-primary));--lui-checkbox-checked-bg:var(--lui-bg-interactive);--lui-checkbox-checked-text:var(--lui-text-inverse);--lui-checkbox-focus-border:var(--lui-bg-interactive);--lui-checkbox-focus-ring-color:color-mix(in srgb,var(--lui-bg-interactive) 40%,transparent);--lui-checkbox-radius:var(--lui-radius-sm)}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { Checkbox, type CheckboxProps } from "./checkbox";
2
2
  export { Checkbox as default } from "./checkbox";
3
+ export { useCheckbox, type UseCheckboxProps } from "@ladder-ui/primitives";
package/dist/index.js CHANGED
@@ -1,51 +1 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var jsxRuntime = require('react/jsx-runtime');
6
- var concatClassNames = require('@ladder-ui/core/concatClassNames');
7
- var react = require('react');
8
-
9
- // ── Internal SVG icons (no external dependency) ───────────────────────────────
10
- function CheckIcon() {
11
- return (jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M2 6 L5 9 L10 3" }) }));
12
- }
13
- function IndeterminateIcon() {
14
- return (jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": "true", children: jsxRuntime.jsx("line", { x1: "2.5", y1: "6", x2: "9.5", y2: "6" }) }));
15
- }
16
- // ── Component ─────────────────────────────────────────────────────────────────
17
- /**
18
- * Checkbox — a fully accessible, themeable checkbox.
19
- *
20
- * - Renders a native `<input type="checkbox">` for full browser and AT support.
21
- * - `ref` points directly to the native input element.
22
- * - Supports `indeterminate` state (shows a dash — useful for "select all" patterns).
23
- * - `status="error"` sets `aria-invalid="true"` automatically.
24
- * - No third-party dependencies — checkmark and dash are inline SVGs.
25
- * - All visual state (checked, indeterminate, focus, disabled, error) is driven by
26
- * CSS `:has()` selectors — zero JS involved in rendering.
27
- */
28
- function Checkbox({ ref, className, size = "md", status = "default", indeterminate = false, disabled, ...props }) {
29
- // Internal ref required to set .indeterminate imperatively (no HTML attribute).
30
- const internalRef = react.useRef(null);
31
- react.useEffect(() => {
32
- if (internalRef.current) {
33
- internalRef.current.indeterminate = indeterminate;
34
- }
35
- }, [indeterminate]);
36
- // Merge external ref (from the consumer) with our internal ref.
37
- function setRef(node) {
38
- internalRef.current = node;
39
- if (typeof ref === "function") {
40
- ref(node);
41
- }
42
- else if (ref) {
43
- ref.current = node;
44
- }
45
- }
46
- return (jsxRuntime.jsxs("span", { "data-slot": "checkbox", "data-disabled": disabled ? "true" : undefined, "data-status": status !== "default" ? status : undefined, className: concatClassNames("lui-checkbox", `lui-checkbox--${size}`, status === "error" && "lui-checkbox--error", disabled && "lui-checkbox--disabled", className), children: [jsxRuntime.jsx("input", { ref: setRef, type: "checkbox", className: "lui-checkbox__input", disabled: disabled, "aria-invalid": props["aria-invalid"] ?? (status === "error" ? true : undefined), ...props }), jsxRuntime.jsxs("span", { className: "lui-checkbox__control", "aria-hidden": "true", children: [jsxRuntime.jsx("span", { className: "lui-checkbox__icon lui-checkbox__icon--check", children: jsxRuntime.jsx(CheckIcon, {}) }), jsxRuntime.jsx("span", { className: "lui-checkbox__icon lui-checkbox__icon--indeterminate", children: jsxRuntime.jsx(IndeterminateIcon, {}) })] })] }));
47
- }
48
- Checkbox.displayName = "Checkbox";
49
-
50
- exports.Checkbox = Checkbox;
51
- exports.default = Checkbox;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),i=require("@ladder-ui/core"),s=require("@ladder-ui/primitives");function r(){return e.jsx("svg",{viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:"M2 6 L5 9 L10 3"})})}function a(){return e.jsx("svg",{viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":"true",children:e.jsx("line",{x1:"2.5",y1:"6",x2:"9.5",y2:"6"})})}const t=i.cva({base:"lui-checkbox",variants:{size:{sm:"lui-checkbox--sm",md:"lui-checkbox--md",lg:"lui-checkbox--lg"},status:{default:"",error:"lui-checkbox--error"},disabled:{true:"lui-checkbox--disabled",false:""}},defaultVariants:{size:"md",status:"default",disabled:!1}});function c({ref:i,className:c,size:n="md",status:o="default",indeterminate:l=!1,disabled:u,...d}){const{wrapperProps:x,inputProps:h}=s.useCheckbox({ref:i,indeterminate:l,status:o,disabled:u,"aria-invalid":d["aria-invalid"]});return e.jsxs("span",{...x,className:t({size:n,status:o,disabled:u,className:c}),children:[e.jsx("input",{className:"lui-checkbox__input",...h,...d}),e.jsxs("span",{className:"lui-checkbox__control","aria-hidden":"true",children:[e.jsx("span",{className:"lui-checkbox__icon lui-checkbox__icon--check",children:e.jsx(r,{})}),e.jsx("span",{className:"lui-checkbox__icon lui-checkbox__icon--indeterminate",children:e.jsx(a,{})})]})]})}c.displayName="Checkbox",Object.defineProperty(exports,"useCheckbox",{enumerable:!0,get:function(){return s.useCheckbox}}),exports.Checkbox=c,exports.default=c;
package/dist/index.mjs CHANGED
@@ -1,46 +1 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import concatClassNames from '@ladder-ui/core/concatClassNames';
3
- import { useRef, useEffect } from 'react';
4
-
5
- // ── Internal SVG icons (no external dependency) ───────────────────────────────
6
- function CheckIcon() {
7
- return (jsx("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: jsx("path", { d: "M2 6 L5 9 L10 3" }) }));
8
- }
9
- function IndeterminateIcon() {
10
- return (jsx("svg", { viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": "true", children: jsx("line", { x1: "2.5", y1: "6", x2: "9.5", y2: "6" }) }));
11
- }
12
- // ── Component ─────────────────────────────────────────────────────────────────
13
- /**
14
- * Checkbox — a fully accessible, themeable checkbox.
15
- *
16
- * - Renders a native `<input type="checkbox">` for full browser and AT support.
17
- * - `ref` points directly to the native input element.
18
- * - Supports `indeterminate` state (shows a dash — useful for "select all" patterns).
19
- * - `status="error"` sets `aria-invalid="true"` automatically.
20
- * - No third-party dependencies — checkmark and dash are inline SVGs.
21
- * - All visual state (checked, indeterminate, focus, disabled, error) is driven by
22
- * CSS `:has()` selectors — zero JS involved in rendering.
23
- */
24
- function Checkbox({ ref, className, size = "md", status = "default", indeterminate = false, disabled, ...props }) {
25
- // Internal ref required to set .indeterminate imperatively (no HTML attribute).
26
- const internalRef = useRef(null);
27
- useEffect(() => {
28
- if (internalRef.current) {
29
- internalRef.current.indeterminate = indeterminate;
30
- }
31
- }, [indeterminate]);
32
- // Merge external ref (from the consumer) with our internal ref.
33
- function setRef(node) {
34
- internalRef.current = node;
35
- if (typeof ref === "function") {
36
- ref(node);
37
- }
38
- else if (ref) {
39
- ref.current = node;
40
- }
41
- }
42
- return (jsxs("span", { "data-slot": "checkbox", "data-disabled": disabled ? "true" : undefined, "data-status": status !== "default" ? status : undefined, className: concatClassNames("lui-checkbox", `lui-checkbox--${size}`, status === "error" && "lui-checkbox--error", disabled && "lui-checkbox--disabled", className), children: [jsx("input", { ref: setRef, type: "checkbox", className: "lui-checkbox__input", disabled: disabled, "aria-invalid": props["aria-invalid"] ?? (status === "error" ? true : undefined), ...props }), jsxs("span", { className: "lui-checkbox__control", "aria-hidden": "true", children: [jsx("span", { className: "lui-checkbox__icon lui-checkbox__icon--check", children: jsx(CheckIcon, {}) }), jsx("span", { className: "lui-checkbox__icon lui-checkbox__icon--indeterminate", children: jsx(IndeterminateIcon, {}) })] })] }));
43
- }
44
- Checkbox.displayName = "Checkbox";
45
-
46
- export { Checkbox, Checkbox as default };
1
+ import{jsxs as e,jsx as i}from"react/jsx-runtime";import{cva as r}from"@ladder-ui/core";import{useCheckbox as a}from"@ladder-ui/primitives";export{useCheckbox}from"@ladder-ui/primitives";function s(){return i("svg",{viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:i("path",{d:"M2 6 L5 9 L10 3"})})}function t(){return i("svg",{viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":"true",children:i("line",{x1:"2.5",y1:"6",x2:"9.5",y2:"6"})})}const o=r({base:"lui-checkbox",variants:{size:{sm:"lui-checkbox--sm",md:"lui-checkbox--md",lg:"lui-checkbox--lg"},status:{default:"",error:"lui-checkbox--error"},disabled:{true:"lui-checkbox--disabled",false:""}},defaultVariants:{size:"md",status:"default",disabled:!1}});function c({ref:r,className:c,size:n="md",status:l="default",indeterminate:d=!1,disabled:u,...h}){const{wrapperProps:m,inputProps:k}=a({ref:r,indeterminate:d,status:l,disabled:u,"aria-invalid":h["aria-invalid"]});return e("span",{...m,className:o({size:n,status:l,disabled:u,className:c}),children:[i("input",{className:"lui-checkbox__input",...k,...h}),e("span",{className:"lui-checkbox__control","aria-hidden":"true",children:[i("span",{className:"lui-checkbox__icon lui-checkbox__icon--check",children:i(s,{})}),i("span",{className:"lui-checkbox__icon lui-checkbox__icon--indeterminate",children:i(t,{})})]})]})}c.displayName="Checkbox";export{c as Checkbox,c as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ladder-ui/checkbox",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -30,7 +30,8 @@
30
30
  "license": "ISC",
31
31
  "repository": {
32
32
  "type": "git",
33
- "url": "git+ssh://git@github.com/ivelaval/ladder-ui.git"
33
+ "url": "https://github.com/ivelaval/ladder-ui.git",
34
+ "directory": "packages/checkbox"
34
35
  },
35
36
  "bugs": {
36
37
  "url": "https://github.com/ivelaval/ladder-ui/issues"
@@ -47,7 +48,8 @@
47
48
  "sass": "^1.90.0",
48
49
  "tslib": "^2.6.2",
49
50
  "typescript": "^5.3.3",
50
- "@ladder-ui/core": "0.3.0"
51
+ "@ladder-ui/core": "0.5.0",
52
+ "@ladder-ui/primitives": "0.5.0"
51
53
  },
52
54
  "peerDependencies": {
53
55
  "@ladder-ui/core": ">=0.0.0",