@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 +52 -28
- package/dist/index.css +14 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -6
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
|
|
17
|
-
import
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
<Button
|
|
23
|
-
</
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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({
|
|
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(
|
|
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":";;;;;;;
|
|
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({
|
|
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(
|
|
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);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ButtonGroup.tsx"],"names":[],"mappings":";;;;;
|
|
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.
|
|
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
|
-
|
|
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":
|
|
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.
|
|
42
|
+
"@asnewyla/button": "0.3.0"
|
|
40
43
|
},
|
|
41
44
|
"devDependencies": {
|
|
42
45
|
"react": "^18.3.0",
|