@asnewyla/button-group 0.1.1 → 0.2.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/README.md CHANGED
@@ -1,28 +1,52 @@
1
- # @asnewyla/button-group
2
-
3
- Groups `@asnewyla/button` components visually (`role="group"`) and propagates
4
- `variant`, `size`, and `disabled` to every child via context. Any child can
5
- override an individual prop.
6
-
7
- ## Install
8
-
9
- ```bash
10
- npm install @asnewyla/button-group
11
- ```
12
-
13
- ## Usage
14
-
15
- ```tsx
16
- import { Button } from '@asnewyla/button';
17
- import { ButtonGroup } from '@asnewyla/button-group';
18
-
19
- <ButtonGroup variant="secondary" aria-label="Text alignment">
20
- <Button>Left</Button>
21
- <Button>Center</Button>
22
- <Button variant="destructive">Right</Button> {/* overrides the group */}
23
- </ButtonGroup>
24
- ```
25
-
26
- ## License
27
-
28
- MIT
1
+ # @asnewyla/button-group
2
+
3
+ Groups `@asnewyla/button` components visually (`role="group"`) and propagates
4
+ `variant`, `size`, and `disabled` to every child via context. Any child can
5
+ override an individual prop.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @asnewyla/button-group
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```tsx
16
+ import '@asnewyla/button/styles.css';
17
+ import '@asnewyla/button-group/styles.css';
18
+ import { Button } from '@asnewyla/button';
19
+ import { ButtonGroup } from '@asnewyla/button-group';
20
+
21
+ <ButtonGroup variant="secondary" aria-label="Text alignment">
22
+ <Button>Left</Button>
23
+ <Button>Center</Button>
24
+ <Button variant="destructive">Right</Button> {/* overrides the group */}
25
+ </ButtonGroup>
26
+ ```
27
+
28
+ ### Layout
29
+
30
+ `styles.css` lays the buttons out in a wrapping row. `gap` sets the space
31
+ between them, on the same scale as `Stack`/`Group`. Without the stylesheet,
32
+ the buttons render inline with no gap. `className` is merged with the
33
+ `xd-button-group` class.
34
+
35
+ ```tsx
36
+ <ButtonGroup gap="md" aria-label="Actions">…</ButtonGroup>
37
+ ```
38
+
39
+ ### Props
40
+
41
+ Every native `<div>` prop, plus:
42
+
43
+ | Prop | Type | Default |
44
+ |---|---|---|
45
+ | `variant` | `ButtonVariant` | — (each button's own) |
46
+ | `size` | `'sm' \| 'md' \| 'lg'` | — (each button's own) |
47
+ | `disabled` | `boolean` | — |
48
+ | `gap` | `'sm' \| 'md' \| 'lg'` (`--xd-space-sm/md/lg`) | `'sm'` |
49
+
50
+ ## License
51
+
52
+ MIT
package/dist/index.css ADDED
@@ -0,0 +1,14 @@
1
+ /* src/components/ButtonGroup.css */
2
+ .xd-button-group {
3
+ display: inline-flex;
4
+ flex-wrap: wrap;
5
+ align-items: center;
6
+ gap: var(--xd-space-sm, 0.375rem);
7
+ }
8
+ .xd-button-group[data-gap=md] {
9
+ gap: var(--xd-space-md, 0.5rem);
10
+ }
11
+ .xd-button-group[data-gap=lg] {
12
+ gap: var(--xd-space-lg, 0.75rem);
13
+ }
14
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ButtonGroup.css"],"sourcesContent":[".xd-button-group {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--xd-space-sm, 0.375rem);\n}\n\n.xd-button-group[data-gap=\"md\"] {\n gap: var(--xd-space-md, 0.5rem);\n}\n\n.xd-button-group[data-gap=\"lg\"] {\n gap: var(--xd-space-lg, 0.75rem);\n}\n"],"mappings":";AAAA,CAAC;AACC,WAAS;AACT,aAAW;AACX,eAAa;AACb,OAAK,IAAI,aAAa,EAAE;AAC1B;AAEA,CAPC,eAOe,CAAC;AACf,OAAK,IAAI,aAAa,EAAE;AAC1B;AAEA,CAXC,eAWe,CAAC;AACf,OAAK,IAAI,aAAa,EAAE;AAC1B;","names":[]}
package/dist/index.d.mts CHANGED
@@ -6,6 +6,8 @@ declare const ButtonGroup: react.ForwardRefExoticComponent<Omit<Omit<react.Detai
6
6
  variant?: ButtonVariant;
7
7
  size?: ButtonSize;
8
8
  disabled?: boolean;
9
+ /** Space between buttons, on the same scale as `Stack`/`Group`. */
10
+ gap?: "sm" | "md" | "lg";
9
11
  children: ReactNode;
10
12
  } & react.RefAttributes<HTMLDivElement>>;
11
13
 
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ declare const ButtonGroup: react.ForwardRefExoticComponent<Omit<Omit<react.Detai
6
6
  variant?: ButtonVariant;
7
7
  size?: ButtonSize;
8
8
  disabled?: boolean;
9
+ /** Space between buttons, on the same scale as `Stack`/`Group`. */
10
+ gap?: "sm" | "md" | "lg";
9
11
  children: ReactNode;
10
12
  } & react.RefAttributes<HTMLDivElement>>;
11
13
 
package/dist/index.js CHANGED
@@ -5,10 +5,28 @@ var button = require('@asnewyla/button');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
7
7
  // src/components/ButtonGroup.tsx
8
- function ButtonGroupInner({ children, variant, size, disabled, ...restProps }, ref) {
8
+ function ButtonGroupInner({
9
+ children,
10
+ variant,
11
+ size,
12
+ disabled,
13
+ gap = "sm",
14
+ className,
15
+ ...restProps
16
+ }, ref) {
9
17
  return (
10
18
  // biome-ignore lint/a11y/useSemanticElements: role="group" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.
11
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref, role: "group", ...restProps, children: /* @__PURE__ */ jsxRuntime.jsx(button.ButtonGroupProvider, { value: { variant, size, disabled }, children }) })
19
+ /* @__PURE__ */ jsxRuntime.jsx(
20
+ "div",
21
+ {
22
+ ref,
23
+ role: "group",
24
+ ...restProps,
25
+ "data-gap": gap,
26
+ className: className ? `xd-button-group ${className}` : "xd-button-group",
27
+ children: /* @__PURE__ */ jsxRuntime.jsx(button.ButtonGroupProvider, { value: { variant, size, disabled }, children })
28
+ }
29
+ )
12
30
  );
13
31
  }
14
32
  var ButtonGroup = react.forwardRef(ButtonGroupInner);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ButtonGroup.tsx"],"names":["jsx","ButtonGroupProvider","forwardRef"],"mappings":";;;;;;;AAmBA,SAAS,gBAAA,CACP,EAAE,QAAA,EAAU,OAAA,EAAS,MAAM,QAAA,EAAU,GAAG,SAAA,EAAU,EAClD,GAAA,EACA;AACA,EAAA;AAAA;AAAA,mCAEG,KAAA,EAAA,EAAI,GAAA,EAAU,IAAA,EAAK,OAAA,EAAS,GAAG,SAAA,EAC9B,QAAA,kBAAAA,cAAA,CAACC,0BAAA,EAAA,EAAoB,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS,EACnD,UACH,CAAA,EACF;AAAA;AAEJ;AAEO,IAAM,WAAA,GAAcC,iBAAW,gBAAgB","file":"index.js","sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n type ReactNode,\n} from 'react';\nimport {\n ButtonGroupProvider,\n type ButtonVariant,\n type ButtonSize,\n} from '@asnewyla/button';\n\nexport type ButtonGroupProps = Omit<ComponentPropsWithoutRef<'div'>, 'role'> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n children: ReactNode;\n};\n\nfunction ButtonGroupInner(\n { children, variant, size, disabled, ...restProps }: ButtonGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.\n <div ref={ref} role=\"group\" {...restProps}>\n <ButtonGroupProvider value={{ variant, size, disabled }}>\n {children}\n </ButtonGroupProvider>\n </div>\n );\n}\n\nexport const ButtonGroup = forwardRef(ButtonGroupInner);\n"]}
1
+ {"version":3,"sources":["../src/components/ButtonGroup.tsx"],"names":["jsx","ButtonGroupProvider","forwardRef"],"mappings":";;;;;;;AAsBA,SAAS,gBAAA,CACP;AAAA,EACE,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA,GAAM,IAAA;AAAA,EACN,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA;AAAA;AAAA,oBAEEA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACJ,GAAG,SAAA;AAAA,QACJ,UAAA,EAAU,GAAA;AAAA,QACV,SAAA,EAAW,SAAA,GAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,GAAK,iBAAA;AAAA,QAExD,QAAA,kBAAAA,cAAA,CAACC,8BAAoB,KAAA,EAAO,EAAE,SAAS,IAAA,EAAM,QAAA,IAC1C,QAAA,EACH;AAAA;AAAA;AACF;AAEJ;AAEO,IAAM,WAAA,GAAcC,iBAAW,gBAAgB","file":"index.js","sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n type ReactNode,\n} from 'react';\nimport {\n ButtonGroupProvider,\n type ButtonVariant,\n type ButtonSize,\n} from '@asnewyla/button';\nimport './ButtonGroup.css';\n\nexport type ButtonGroupProps = Omit<ComponentPropsWithoutRef<'div'>, 'role'> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n /** Space between buttons, on the same scale as `Stack`/`Group`. */\n gap?: 'sm' | 'md' | 'lg';\n children: ReactNode;\n};\n\nfunction ButtonGroupInner(\n {\n children,\n variant,\n size,\n disabled,\n gap = 'sm',\n className,\n ...restProps\n }: ButtonGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.\n <div\n ref={ref}\n role=\"group\"\n {...restProps}\n data-gap={gap}\n className={className ? `xd-button-group ${className}` : 'xd-button-group'}\n >\n <ButtonGroupProvider value={{ variant, size, disabled }}>\n {children}\n </ButtonGroupProvider>\n </div>\n );\n}\n\nexport const ButtonGroup = forwardRef(ButtonGroupInner);\n"]}
package/dist/index.mjs CHANGED
@@ -3,10 +3,28 @@ import { ButtonGroupProvider } from '@asnewyla/button';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  // src/components/ButtonGroup.tsx
6
- function ButtonGroupInner({ children, variant, size, disabled, ...restProps }, ref) {
6
+ function ButtonGroupInner({
7
+ children,
8
+ variant,
9
+ size,
10
+ disabled,
11
+ gap = "sm",
12
+ className,
13
+ ...restProps
14
+ }, ref) {
7
15
  return (
8
16
  // biome-ignore lint/a11y/useSemanticElements: role="group" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.
9
- /* @__PURE__ */ jsx("div", { ref, role: "group", ...restProps, children: /* @__PURE__ */ jsx(ButtonGroupProvider, { value: { variant, size, disabled }, children }) })
17
+ /* @__PURE__ */ jsx(
18
+ "div",
19
+ {
20
+ ref,
21
+ role: "group",
22
+ ...restProps,
23
+ "data-gap": gap,
24
+ className: className ? `xd-button-group ${className}` : "xd-button-group",
25
+ children: /* @__PURE__ */ jsx(ButtonGroupProvider, { value: { variant, size, disabled }, children })
26
+ }
27
+ )
10
28
  );
11
29
  }
12
30
  var ButtonGroup = forwardRef(ButtonGroupInner);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ButtonGroup.tsx"],"names":[],"mappings":";;;;;AAmBA,SAAS,gBAAA,CACP,EAAE,QAAA,EAAU,OAAA,EAAS,MAAM,QAAA,EAAU,GAAG,SAAA,EAAU,EAClD,GAAA,EACA;AACA,EAAA;AAAA;AAAA,wBAEG,KAAA,EAAA,EAAI,GAAA,EAAU,IAAA,EAAK,OAAA,EAAS,GAAG,SAAA,EAC9B,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS,EACnD,UACH,CAAA,EACF;AAAA;AAEJ;AAEO,IAAM,WAAA,GAAc,WAAW,gBAAgB","file":"index.mjs","sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n type ReactNode,\n} from 'react';\nimport {\n ButtonGroupProvider,\n type ButtonVariant,\n type ButtonSize,\n} from '@asnewyla/button';\n\nexport type ButtonGroupProps = Omit<ComponentPropsWithoutRef<'div'>, 'role'> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n children: ReactNode;\n};\n\nfunction ButtonGroupInner(\n { children, variant, size, disabled, ...restProps }: ButtonGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.\n <div ref={ref} role=\"group\" {...restProps}>\n <ButtonGroupProvider value={{ variant, size, disabled }}>\n {children}\n </ButtonGroupProvider>\n </div>\n );\n}\n\nexport const ButtonGroup = forwardRef(ButtonGroupInner);\n"]}
1
+ {"version":3,"sources":["../src/components/ButtonGroup.tsx"],"names":[],"mappings":";;;;;AAsBA,SAAS,gBAAA,CACP;AAAA,EACE,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA,GAAM,IAAA;AAAA,EACN,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA;AAAA;AAAA,oBAEE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACJ,GAAG,SAAA;AAAA,QACJ,UAAA,EAAU,GAAA;AAAA,QACV,SAAA,EAAW,SAAA,GAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,GAAK,iBAAA;AAAA,QAExD,QAAA,kBAAA,GAAA,CAAC,uBAAoB,KAAA,EAAO,EAAE,SAAS,IAAA,EAAM,QAAA,IAC1C,QAAA,EACH;AAAA;AAAA;AACF;AAEJ;AAEO,IAAM,WAAA,GAAc,WAAW,gBAAgB","file":"index.mjs","sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n type ReactNode,\n} from 'react';\nimport {\n ButtonGroupProvider,\n type ButtonVariant,\n type ButtonSize,\n} from '@asnewyla/button';\nimport './ButtonGroup.css';\n\nexport type ButtonGroupProps = Omit<ComponentPropsWithoutRef<'div'>, 'role'> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n /** Space between buttons, on the same scale as `Stack`/`Group`. */\n gap?: 'sm' | 'md' | 'lg';\n children: ReactNode;\n};\n\nfunction ButtonGroupInner(\n {\n children,\n variant,\n size,\n disabled,\n gap = 'sm',\n className,\n ...restProps\n }: ButtonGroupProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" on a div is a correct WAI-ARIA pattern for a button toolbar; <fieldset> is for form-control groupings and carries unwanted default browser chrome.\n <div\n ref={ref}\n role=\"group\"\n {...restProps}\n data-gap={gap}\n className={className ? `xd-button-group ${className}` : 'xd-button-group'}\n >\n <ButtonGroupProvider value={{ variant, size, disabled }}>\n {children}\n </ButtonGroupProvider>\n </div>\n );\n}\n\nexport const ButtonGroup = forwardRef(ButtonGroupInner);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asnewyla/button-group",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Groups buttons visually and propagates shared props via context",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -16,15 +16,18 @@
16
16
  "types": "dist/index.d.ts",
17
17
  "exports": {
18
18
  ".": {
19
+ "types": "./dist/index.d.ts",
19
20
  "import": "./dist/index.mjs",
20
- "require": "./dist/index.js",
21
- "types": "./dist/index.d.ts"
22
- }
21
+ "require": "./dist/index.js"
22
+ },
23
+ "./styles.css": "./dist/index.css"
23
24
  },
24
25
  "files": [
25
26
  "dist"
26
27
  ],
27
- "sideEffects": false,
28
+ "sideEffects": [
29
+ "*.css"
30
+ ],
28
31
  "keywords": [
29
32
  "react",
30
33
  "button-group",
@@ -36,7 +39,7 @@
36
39
  "react-dom": "^18.0.0 || ^19.0.0"
37
40
  },
38
41
  "dependencies": {
39
- "@asnewyla/button": "0.2.0"
42
+ "@asnewyla/button": "0.3.0"
40
43
  },
41
44
  "devDependencies": {
42
45
  "react": "^18.3.0",