@chayns-ui/core 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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/accordion.css +147 -0
  4. package/dist/button.css +191 -0
  5. package/dist/card.css +13 -0
  6. package/dist/components/accordion/Accordion.d.ts +4 -0
  7. package/dist/components/accordion/Accordion.d.ts.map +1 -0
  8. package/dist/components/accordion/Accordion.js +72 -0
  9. package/dist/components/accordion/Accordion.js.map +1 -0
  10. package/dist/components/accordion/Accordion.types.d.ts +37 -0
  11. package/dist/components/accordion/Accordion.types.d.ts.map +1 -0
  12. package/dist/components/accordion/AccordionContext.d.ts +20 -0
  13. package/dist/components/accordion/AccordionContext.d.ts.map +1 -0
  14. package/dist/components/accordion/AccordionContext.js +18 -0
  15. package/dist/components/accordion/AccordionContext.js.map +1 -0
  16. package/dist/components/accordion/AccordionGroup.d.ts +4 -0
  17. package/dist/components/accordion/AccordionGroup.d.ts.map +1 -0
  18. package/dist/components/accordion/AccordionGroup.js +35 -0
  19. package/dist/components/accordion/AccordionGroup.js.map +1 -0
  20. package/dist/components/accordion/index.d.ts +4 -0
  21. package/dist/components/accordion/index.d.ts.map +1 -0
  22. package/dist/components/accordion/index.js +3 -0
  23. package/dist/components/button/Button.d.ts +4 -0
  24. package/dist/components/button/Button.d.ts.map +1 -0
  25. package/dist/components/button/Button.js +17 -0
  26. package/dist/components/button/Button.js.map +1 -0
  27. package/dist/components/button/Button.types.d.ts +35 -0
  28. package/dist/components/button/Button.types.d.ts.map +1 -0
  29. package/dist/components/button/ButtonIcon.d.ts +7 -0
  30. package/dist/components/button/ButtonIcon.d.ts.map +1 -0
  31. package/dist/components/button/ButtonIcon.js +19 -0
  32. package/dist/components/button/ButtonIcon.js.map +1 -0
  33. package/dist/components/button/IconButton.d.ts +4 -0
  34. package/dist/components/button/IconButton.d.ts.map +1 -0
  35. package/dist/components/button/IconButton.js +17 -0
  36. package/dist/components/button/IconButton.js.map +1 -0
  37. package/dist/components/button/buttonClassName.d.ts +3 -0
  38. package/dist/components/button/buttonClassName.d.ts.map +1 -0
  39. package/dist/components/button/buttonClassName.js +9 -0
  40. package/dist/components/button/buttonClassName.js.map +1 -0
  41. package/dist/components/button/index.d.ts +4 -0
  42. package/dist/components/button/index.d.ts.map +1 -0
  43. package/dist/components/button/index.js +3 -0
  44. package/dist/components/card/Card.d.ts +4 -0
  45. package/dist/components/card/Card.d.ts.map +1 -0
  46. package/dist/components/card/Card.js +18 -0
  47. package/dist/components/card/Card.js.map +1 -0
  48. package/dist/components/card/Card.types.d.ts +9 -0
  49. package/dist/components/card/Card.types.d.ts.map +1 -0
  50. package/dist/components/card/index.d.ts +3 -0
  51. package/dist/components/card/index.d.ts.map +1 -0
  52. package/dist/components/card/index.js +2 -0
  53. package/dist/components/list/List.d.ts +4 -0
  54. package/dist/components/list/List.d.ts.map +1 -0
  55. package/dist/components/list/List.js +14 -0
  56. package/dist/components/list/List.js.map +1 -0
  57. package/dist/components/list/List.types.d.ts +32 -0
  58. package/dist/components/list/List.types.d.ts.map +1 -0
  59. package/dist/components/list/ListItem.d.ts +4 -0
  60. package/dist/components/list/ListItem.d.ts.map +1 -0
  61. package/dist/components/list/ListItem.js +67 -0
  62. package/dist/components/list/ListItem.js.map +1 -0
  63. package/dist/components/list/index.d.ts +4 -0
  64. package/dist/components/list/index.d.ts.map +1 -0
  65. package/dist/components/list/index.js +3 -0
  66. package/dist/index.d.ts +9 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +8 -0
  69. package/dist/list.css +121 -0
  70. package/dist/styles.css +4 -0
  71. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tobit.Software
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @chayns-ui/core
2
+
3
+ React Core UI components. Consumers import component JavaScript and CSS explicitly.
@@ -0,0 +1,147 @@
1
+ @layer chayns.components {
2
+ .chayns-accordion {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ .chayns-accordion--standalone {
7
+ overflow: hidden;
8
+ border: 1px solid var(--border);
9
+ border-radius: 12px;
10
+ background: var(--surface);
11
+ }
12
+
13
+ .chayns-accordion--wrapped {
14
+ overflow: hidden;
15
+ border: 1px solid var(--border);
16
+ border-radius: 10px;
17
+ background: var(--surface);
18
+ }
19
+
20
+ .chayns-accordion-group {
21
+ box-sizing: border-box;
22
+ overflow: hidden;
23
+ border: 1px solid var(--border);
24
+ border-radius: 12px;
25
+ background: var(--surface);
26
+ }
27
+
28
+ .chayns-accordion--grouped + .chayns-accordion--grouped {
29
+ border-top: 1px solid var(--border);
30
+ }
31
+
32
+ .chayns-accordion__header {
33
+ position: relative;
34
+ box-sizing: border-box;
35
+ inline-size: 100%;
36
+ display: flex;
37
+ align-items: center;
38
+ gap: var(--k12);
39
+ margin: 0;
40
+ padding: var(--k14) var(--k16);
41
+ border: 0;
42
+ background: transparent;
43
+ font: inherit;
44
+ text-align: start;
45
+ cursor: pointer;
46
+ }
47
+
48
+ .chayns-accordion--wrapped > .chayns-accordion__header {
49
+ gap: var(--k10);
50
+ padding: var(--k10) var(--k12);
51
+ }
52
+
53
+ .chayns-accordion__header:focus-visible {
54
+ outline: none;
55
+ box-shadow: 0 0 0 var(--focus-ring-size)
56
+ rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong));
57
+ }
58
+
59
+ .chayns-accordion__chevron {
60
+ flex: none;
61
+ inline-size: var(--k16);
62
+ font-size: var(--icon);
63
+ color: var(--accent);
64
+ transition: transform 0.2s ease;
65
+ }
66
+
67
+ .chayns-accordion--wrapped > .chayns-accordion__header > .chayns-accordion__chevron {
68
+ inline-size: var(--k14);
69
+ font-size: var(--fs-caption);
70
+ }
71
+
72
+ .chayns-accordion--open > .chayns-accordion__header > .chayns-accordion__chevron {
73
+ transform: rotate(90deg);
74
+ }
75
+
76
+ .chayns-accordion__title {
77
+ flex: 1;
78
+ min-inline-size: 0;
79
+ font-size: var(--fs-body);
80
+ color: var(--text);
81
+ }
82
+
83
+ .chayns-accordion--open > .chayns-accordion__header > .chayns-accordion__title {
84
+ font-weight: 600;
85
+ }
86
+
87
+ .chayns-accordion__panel {
88
+ display: grid;
89
+ grid-template-rows: 0fr;
90
+ transition: grid-template-rows 0.25s ease;
91
+ }
92
+
93
+ .chayns-accordion--open > .chayns-accordion__panel {
94
+ grid-template-rows: 1fr;
95
+ }
96
+
97
+ .chayns-accordion__inner {
98
+ overflow: hidden;
99
+ visibility: hidden;
100
+ transition: visibility 0s linear 0.25s;
101
+ }
102
+
103
+ .chayns-accordion--open > .chayns-accordion__panel > .chayns-accordion__inner {
104
+ visibility: visible;
105
+ transition: visibility 0s linear 0s;
106
+ }
107
+
108
+ .chayns-accordion__content {
109
+ padding: 0 var(--k16) var(--k15) calc(var(--k16) + var(--k16) + var(--k12));
110
+ font-size: var(--fs-body);
111
+ line-height: 1.55;
112
+ color: var(--text-3);
113
+ }
114
+
115
+ .chayns-accordion--wrapped
116
+ > .chayns-accordion__panel
117
+ > .chayns-accordion__inner
118
+ > .chayns-accordion__content {
119
+ padding: 0 var(--k12) var(--k10) calc(var(--k12) + var(--k14) + var(--k10));
120
+ }
121
+
122
+ .chayns-accordion--disabled > .chayns-accordion__header {
123
+ cursor: default;
124
+ }
125
+
126
+ .chayns-accordion--disabled > .chayns-accordion__header > .chayns-accordion__chevron {
127
+ color: var(--muted);
128
+ }
129
+
130
+ .chayns-accordion--disabled > .chayns-accordion__header > .chayns-accordion__title {
131
+ color: var(--muted);
132
+ }
133
+
134
+ @media (hover: hover) {
135
+ .chayns-accordion__header:not(:disabled):hover {
136
+ background: var(--hover);
137
+ }
138
+ }
139
+
140
+ @media (prefers-reduced-motion: reduce) {
141
+ .chayns-accordion__chevron,
142
+ .chayns-accordion__panel,
143
+ .chayns-accordion__inner {
144
+ transition: none;
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,191 @@
1
+ @layer chayns.components {
2
+ :where(.chayns-button, .chayns-icon-button) {
3
+ box-sizing: border-box;
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ max-inline-size: 100%;
8
+ margin: 0;
9
+ border: 0;
10
+ font: inherit;
11
+ font-size: var(--fs-body);
12
+ font-weight: 500;
13
+ line-height: 1.1;
14
+ text-align: center;
15
+ color: var(--text);
16
+ cursor: pointer;
17
+ }
18
+
19
+ .chayns-button {
20
+ gap: var(--sp-2);
21
+ padding-block: var(--btn-py);
22
+ padding-inline: var(--btn-px);
23
+ border-radius: 999px;
24
+ }
25
+
26
+ .chayns-button--ghost {
27
+ padding-inline: var(--sp-4);
28
+ }
29
+
30
+ :where(.chayns-icon-button) {
31
+ flex: none;
32
+ inline-size: var(--ctrl-h);
33
+ block-size: var(--ctrl-h);
34
+ padding: 0;
35
+ border-radius: 50%;
36
+ }
37
+
38
+ :where(.chayns-button--primary, .chayns-icon-button--primary) {
39
+ background: var(--accent);
40
+ color: var(--on-accent);
41
+ box-shadow: var(--shadow-btn);
42
+ }
43
+
44
+ :where(.chayns-button--outline, .chayns-icon-button--outline) {
45
+ border: 1.5px solid var(--accent);
46
+ background: var(--surface);
47
+ color: var(--accent);
48
+ }
49
+
50
+ :where(.chayns-button--ghost, .chayns-icon-button--ghost) {
51
+ background: transparent;
52
+ color: var(--text-2);
53
+ }
54
+
55
+ :where(.chayns-button--danger, .chayns-icon-button--danger) {
56
+ background: var(--danger-bg);
57
+ color: var(--danger);
58
+ }
59
+
60
+ :where(.chayns-button, .chayns-icon-button):active:not(:disabled) {
61
+ transform: scale(0.97);
62
+ }
63
+
64
+ :where(.chayns-icon-button):active:not(:disabled) {
65
+ transform: scale(0.9);
66
+ }
67
+
68
+ :where(.chayns-button--primary, .chayns-icon-button--primary):active:not(:disabled) {
69
+ background: var(--accent-active);
70
+ }
71
+
72
+ :where(.chayns-button--outline, .chayns-icon-button--outline):active:not(:disabled) {
73
+ background: var(--accent);
74
+ color: var(--on-accent);
75
+ }
76
+
77
+ :where(.chayns-button--ghost, .chayns-icon-button--ghost):active:not(:disabled) {
78
+ background: var(--surface-alt);
79
+ color: var(--accent);
80
+ }
81
+
82
+ :where(.chayns-button--danger, .chayns-icon-button--danger):active:not(:disabled) {
83
+ background: var(--danger-bg-hover);
84
+ }
85
+
86
+ :where(.chayns-button, .chayns-icon-button):disabled {
87
+ color: var(--disabled-fg);
88
+ cursor: not-allowed;
89
+ box-shadow: none;
90
+ transform: none;
91
+ }
92
+
93
+ :where(
94
+ .chayns-button--primary,
95
+ .chayns-button--danger,
96
+ .chayns-icon-button--primary,
97
+ .chayns-icon-button--danger
98
+ ):disabled {
99
+ background: var(--disabled-bg);
100
+ }
101
+
102
+ :where(.chayns-button--outline, .chayns-icon-button--outline):disabled {
103
+ border-color: var(--disabled-border);
104
+ background: var(--surface);
105
+ }
106
+
107
+ :where(.chayns-button--ghost, .chayns-icon-button--ghost):disabled {
108
+ background: transparent;
109
+ }
110
+
111
+ .chayns-button-icon {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ inline-size: 1em;
116
+ block-size: 1em;
117
+ flex: none;
118
+ line-height: 1;
119
+ }
120
+
121
+ .chayns-button-icon__weight {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ }
126
+
127
+ .chayns-button-icon__weight--active {
128
+ display: none;
129
+ }
130
+
131
+ :where(.chayns-button, .chayns-icon-button):active:not(:disabled)
132
+ .chayns-button-icon__weight:not(.chayns-button-icon__weight--active) {
133
+ display: none;
134
+ }
135
+
136
+ :where(.chayns-button, .chayns-icon-button):active:not(:disabled)
137
+ .chayns-button-icon__weight--active {
138
+ display: inline-flex;
139
+ }
140
+
141
+ @media (hover: hover) {
142
+ :where(.chayns-button--primary, .chayns-icon-button--primary):hover:not(:disabled) {
143
+ background: var(--accent-hover);
144
+ box-shadow: var(--shadow-btn-hover);
145
+ }
146
+
147
+ :where(.chayns-button--outline, .chayns-icon-button--outline):hover:not(:disabled) {
148
+ background: var(--accent);
149
+ color: var(--on-accent);
150
+ box-shadow: var(--shadow-btn-hover);
151
+ }
152
+
153
+ :where(.chayns-button--ghost, .chayns-icon-button--ghost):hover:not(:disabled) {
154
+ background: var(--surface-alt);
155
+ color: var(--accent);
156
+ }
157
+
158
+ :where(.chayns-button--danger, .chayns-icon-button--danger):hover:not(:disabled) {
159
+ background: var(--danger-bg-hover);
160
+ }
161
+
162
+ :where(.chayns-button, .chayns-icon-button):hover:not(:disabled)
163
+ .chayns-button-icon__weight:not(.chayns-button-icon__weight--active) {
164
+ display: none;
165
+ }
166
+
167
+ :where(.chayns-button, .chayns-icon-button):hover:not(:disabled)
168
+ .chayns-button-icon__weight--active {
169
+ display: inline-flex;
170
+ }
171
+ }
172
+
173
+ :where(.chayns-button, .chayns-icon-button):focus-visible {
174
+ outline: none;
175
+ box-shadow: 0 0 0 var(--focus-ring-size)
176
+ rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong));
177
+ }
178
+
179
+ :where(.chayns-button--primary, .chayns-icon-button--primary):focus-visible {
180
+ box-shadow:
181
+ 0 0 0 var(--focus-ring-size) rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong)),
182
+ var(--shadow-btn);
183
+ }
184
+
185
+ @media (forced-colors: active) {
186
+ :where(.chayns-button, .chayns-icon-button):focus-visible {
187
+ outline: var(--focus-ring-size) solid ButtonText;
188
+ outline-offset: 1px;
189
+ }
190
+ }
191
+ }
package/dist/card.css ADDED
@@ -0,0 +1,13 @@
1
+ @layer chayns.components {
2
+ .chayns-card {
3
+ box-sizing: border-box;
4
+ display: block;
5
+ background: var(--surface);
6
+ border: 1px solid var(--border);
7
+ border-radius: 16px;
8
+ }
9
+
10
+ .chayns-card--elevated {
11
+ box-shadow: var(--shadow-card);
12
+ }
13
+ }
@@ -0,0 +1,4 @@
1
+ import type { AccordionProps } from './Accordion.types.js';
2
+ declare function Accordion({ children, className, defaultOpen, disabled, id, onOpenChange, open, title, }: AccordionProps): import("react").JSX.Element;
3
+ export default Accordion;
4
+ //# sourceMappingURL=Accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/Accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,iBAAS,SAAS,CAAC,EACjB,QAAQ,EACR,SAAS,EACT,WAAmB,EACnB,QAAgB,EAChB,EAAE,EACF,YAAY,EACZ,IAAI,EACJ,KAAK,GACN,EAAE,cAAc,+BA8EhB;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { AccordionDepthContext, AccordionGroupContext } from "./AccordionContext.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useContext, useId, useState } from "react";
4
+ //#region src/components/accordion/Accordion.tsx
5
+ function Accordion({ children, className, defaultOpen = false, disabled = false, id, onOpenChange, open, title }) {
6
+ const depth = useContext(AccordionDepthContext);
7
+ const group = useContext(AccordionGroupContext);
8
+ const generatedId = useId();
9
+ const baseId = id ?? generatedId;
10
+ const headerId = `${baseId}-header`;
11
+ const panelId = `${baseId}-panel`;
12
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
13
+ let isOpen;
14
+ if (group) isOpen = group.isOpen(baseId);
15
+ else if (open !== void 0) isOpen = open;
16
+ else isOpen = uncontrolledOpen;
17
+ const handleToggle = () => {
18
+ if (group) {
19
+ group.toggle(baseId);
20
+ return;
21
+ }
22
+ const nextOpen = !isOpen;
23
+ if (open === void 0) setUncontrolledOpen(nextOpen);
24
+ onOpenChange?.(nextOpen);
25
+ };
26
+ const grouped = group !== null;
27
+ const rootClassName = [
28
+ "chayns-accordion",
29
+ grouped ? "chayns-accordion--grouped" : !grouped && depth > 0 ? "chayns-accordion--wrapped" : "chayns-accordion--standalone",
30
+ isOpen ? "chayns-accordion--open" : null,
31
+ disabled ? "chayns-accordion--disabled" : null,
32
+ className
33
+ ].filter(Boolean).join(" ");
34
+ return /* @__PURE__ */ jsxs("div", {
35
+ className: rootClassName,
36
+ children: [/* @__PURE__ */ jsxs("button", {
37
+ "aria-controls": panelId,
38
+ "aria-expanded": isOpen,
39
+ className: "chayns-accordion__header",
40
+ disabled,
41
+ id: headerId,
42
+ onClick: handleToggle,
43
+ type: "button",
44
+ children: [/* @__PURE__ */ jsx("i", {
45
+ "aria-hidden": "true",
46
+ className: "chayns-accordion__chevron far fa-chevron-right"
47
+ }), /* @__PURE__ */ jsx("span", {
48
+ className: "chayns-accordion__title",
49
+ children: title
50
+ })]
51
+ }), /* @__PURE__ */ jsx("div", {
52
+ "aria-labelledby": headerId,
53
+ className: "chayns-accordion__panel",
54
+ id: panelId,
55
+ role: "region",
56
+ children: /* @__PURE__ */ jsx("div", {
57
+ className: "chayns-accordion__inner",
58
+ children: /* @__PURE__ */ jsx("div", {
59
+ className: "chayns-accordion__content",
60
+ children: /* @__PURE__ */ jsx(AccordionDepthContext.Provider, {
61
+ value: depth + 1,
62
+ children
63
+ })
64
+ })
65
+ })
66
+ })]
67
+ });
68
+ }
69
+ //#endregion
70
+ export { Accordion as default };
71
+
72
+ //# sourceMappingURL=Accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.js","names":[],"sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["import { useContext, useId, useState } from 'react';\n\nimport { AccordionDepthContext, AccordionGroupContext } from './AccordionContext.js';\nimport type { AccordionProps } from './Accordion.types.js';\n\nfunction Accordion({\n children,\n className,\n defaultOpen = false,\n disabled = false,\n id,\n onOpenChange,\n open,\n title,\n}: AccordionProps) {\n const depth = useContext(AccordionDepthContext);\n const group = useContext(AccordionGroupContext);\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const headerId = `${baseId}-header`;\n const panelId = `${baseId}-panel`;\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\n let isOpen: boolean;\n if (group) {\n isOpen = group.isOpen(baseId);\n } else if (open !== undefined) {\n isOpen = open;\n } else {\n isOpen = uncontrolledOpen;\n }\n\n const handleToggle = () => {\n if (group) {\n group.toggle(baseId);\n return;\n }\n\n const nextOpen = !isOpen;\n if (open === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n };\n\n const grouped = group !== null;\n const wrapped = !grouped && depth > 0;\n const variantClassName = grouped\n ? 'chayns-accordion--grouped'\n : wrapped\n ? 'chayns-accordion--wrapped'\n : 'chayns-accordion--standalone';\n\n const rootClassName = [\n 'chayns-accordion',\n variantClassName,\n isOpen ? 'chayns-accordion--open' : null,\n disabled ? 'chayns-accordion--disabled' : null,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClassName}>\n <button\n aria-controls={panelId}\n aria-expanded={isOpen}\n className=\"chayns-accordion__header\"\n disabled={disabled}\n id={headerId}\n onClick={handleToggle}\n type=\"button\"\n >\n <i aria-hidden=\"true\" className=\"chayns-accordion__chevron far fa-chevron-right\" />\n <span className=\"chayns-accordion__title\">{title}</span>\n </button>\n <div\n aria-labelledby={headerId}\n className=\"chayns-accordion__panel\"\n id={panelId}\n role=\"region\"\n >\n <div className=\"chayns-accordion__inner\">\n <div className=\"chayns-accordion__content\">\n <AccordionDepthContext.Provider value={depth + 1}>\n {children}\n </AccordionDepthContext.Provider>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default Accordion;\n"],"mappings":";;;;AAKA,SAAS,UAAU,EACjB,UACA,WACA,cAAc,OACd,WAAW,OACX,IACA,cACA,MACA,SACiB;CACjB,MAAM,QAAQ,WAAW,qBAAqB;CAC9C,MAAM,QAAQ,WAAW,qBAAqB;CAC9C,MAAM,cAAc,MAAM;CAC1B,MAAM,SAAS,MAAM;CACrB,MAAM,WAAW,GAAG,OAAO;CAC3B,MAAM,UAAU,GAAG,OAAO;CAE1B,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,WAAW;CAEpE,IAAI;CACJ,IAAI,OACF,SAAS,MAAM,OAAO,MAAM;MACvB,IAAI,SAAS,KAAA,GAClB,SAAS;MAET,SAAS;CAGX,MAAM,qBAAqB;EACzB,IAAI,OAAO;GACT,MAAM,OAAO,MAAM;GACnB;EACF;EAEA,MAAM,WAAW,CAAC;EAClB,IAAI,SAAS,KAAA,GAAW,oBAAoB,QAAQ;EACpD,eAAe,QAAQ;CACzB;CAEA,MAAM,UAAU,UAAU;CAQ1B,MAAM,gBAAgB;EACpB;EAPuB,UACrB,8BAFY,CAAC,WAAW,QAAQ,IAI9B,8BACA;EAKJ,SAAS,2BAA2B;EACpC,WAAW,+BAA+B;EAC1C;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,qBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,qBAAC,UAAD;GACE,iBAAe;GACf,iBAAe;GACf,WAAU;GACA;GACV,IAAI;GACJ,SAAS;GACT,MAAK;GAPP,UAAA,CASE,oBAAC,KAAD;IAAG,eAAY;IAAO,WAAU;GAAkD,CAAA,GAClF,oBAAC,QAAD;IAAM,WAAU;IAA2B,UAAA;GAAY,CAAA,CACjD;EACR,CAAA,GAAA,oBAAC,OAAD;GACE,mBAAiB;GACjB,WAAU;GACV,IAAI;GACJ,MAAK;GAEL,UAAA,oBAAC,OAAD;IAAK,WAAU;IACb,UAAA,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,sBAAsB,UAAvB;MAAgC,OAAO,QAAQ;MAC5C;KAC6B,CAAA;IAC7B,CAAA;GACF,CAAA;EACF,CAAA,CACF;;AAET"}
@@ -0,0 +1,37 @@
1
+ import type { ReactNode } from 'react';
2
+ /** Props for a single disclosure accordion. */
3
+ export interface AccordionProps {
4
+ /** Visible, localized header label used as the accessible name. */
5
+ title: ReactNode;
6
+ /** Panel content revealed when the accordion is open. */
7
+ children?: ReactNode;
8
+ /** Controlled open state. Ignored when inside an AccordionGroup. */
9
+ open?: boolean;
10
+ /** Uncontrolled initial open state. Ignored when inside an AccordionGroup. */
11
+ defaultOpen?: boolean;
12
+ /** Called with the next open state on user toggle. */
13
+ onOpenChange?: (open: boolean) => void;
14
+ /** Disables the header trigger. */
15
+ disabled?: boolean;
16
+ /**
17
+ * Stable id used to wire header and panel and, inside an AccordionGroup, to
18
+ * identify the item. Falls back to a generated id.
19
+ */
20
+ id?: string;
21
+ /** Additional class names on the accordion root element. */
22
+ className?: string;
23
+ }
24
+ /** Props for a group of mutually exclusive accordions. */
25
+ export interface AccordionGroupProps {
26
+ /** Accordion items belonging to the group. */
27
+ children?: ReactNode;
28
+ /** Controlled id of the currently open item, or null when all are closed. */
29
+ openId?: string | null;
30
+ /** Uncontrolled id of the initially open item. */
31
+ defaultOpenId?: string | null;
32
+ /** Called with the next open item id, or null when the group closes. */
33
+ onOpenChange?: (openId: string | null) => void;
34
+ /** Additional class names on the group root element. */
35
+ className?: string;
36
+ }
37
+ //# sourceMappingURL=Accordion.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.types.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/Accordion.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,KAAK,EAAE,SAAS,CAAC;IAEjB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,wEAAwE;IACxE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAE/C,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Nesting depth of the current accordion subtree. Depth 0 is a top-level
3
+ * accordion; any depth greater than 0 renders as an automatically detected
4
+ * wrapped (nested) accordion. Each open panel provides an incremented depth to
5
+ * its content.
6
+ */
7
+ export declare const AccordionDepthContext: import("react").Context<number>;
8
+ /** Exclusive open-state contract shared by an AccordionGroup with its items. */
9
+ export interface AccordionGroupContextValue {
10
+ /** Whether the item registered under this id is the open one. */
11
+ isOpen: (id: string) => boolean;
12
+ /** Toggles the item registered under this id within the group. */
13
+ toggle: (id: string) => void;
14
+ }
15
+ /**
16
+ * Present when an Accordion is rendered inside an AccordionGroup. Items then
17
+ * share the group's exclusive open state instead of owning local state.
18
+ */
19
+ export declare const AccordionGroupContext: import("react").Context<AccordionGroupContextValue | null>;
20
+ //# sourceMappingURL=AccordionContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionContext.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/AccordionContext.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,iCAA2B,CAAC;AAE9D,gFAAgF;AAChF,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAEhC,kEAAkE;IAClE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,4DAAyD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { createContext } from "react";
2
+ //#region src/components/accordion/AccordionContext.ts
3
+ /**
4
+ * Nesting depth of the current accordion subtree. Depth 0 is a top-level
5
+ * accordion; any depth greater than 0 renders as an automatically detected
6
+ * wrapped (nested) accordion. Each open panel provides an incremented depth to
7
+ * its content.
8
+ */
9
+ var AccordionDepthContext = createContext(0);
10
+ /**
11
+ * Present when an Accordion is rendered inside an AccordionGroup. Items then
12
+ * share the group's exclusive open state instead of owning local state.
13
+ */
14
+ var AccordionGroupContext = createContext(null);
15
+ //#endregion
16
+ export { AccordionDepthContext, AccordionGroupContext };
17
+
18
+ //# sourceMappingURL=AccordionContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionContext.js","names":[],"sources":["../../../src/components/accordion/AccordionContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\n/**\n * Nesting depth of the current accordion subtree. Depth 0 is a top-level\n * accordion; any depth greater than 0 renders as an automatically detected\n * wrapped (nested) accordion. Each open panel provides an incremented depth to\n * its content.\n */\nexport const AccordionDepthContext = createContext<number>(0);\n\n/** Exclusive open-state contract shared by an AccordionGroup with its items. */\nexport interface AccordionGroupContextValue {\n /** Whether the item registered under this id is the open one. */\n isOpen: (id: string) => boolean;\n\n /** Toggles the item registered under this id within the group. */\n toggle: (id: string) => void;\n}\n\n/**\n * Present when an Accordion is rendered inside an AccordionGroup. Items then\n * share the group's exclusive open state instead of owning local state.\n */\nexport const AccordionGroupContext = createContext<AccordionGroupContextValue | null>(null);\n"],"mappings":";;;;;;;;AAQA,IAAa,wBAAwB,cAAsB,CAAC;;;;;AAe5D,IAAa,wBAAwB,cAAiD,IAAI"}
@@ -0,0 +1,4 @@
1
+ import type { AccordionGroupProps } from './Accordion.types.js';
2
+ declare function AccordionGroup({ children, className, defaultOpenId, onOpenChange, openId, }: AccordionGroupProps): import("react").JSX.Element;
3
+ export default AccordionGroup;
4
+ //# sourceMappingURL=AccordionGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionGroup.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/AccordionGroup.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,aAAoB,EACpB,YAAY,EACZ,MAAM,GACP,EAAE,mBAAmB,+BA6BrB;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { AccordionGroupContext } from "./AccordionContext.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useCallback, useMemo, useState } from "react";
4
+ //#region src/components/accordion/AccordionGroup.tsx
5
+ function AccordionGroup({ children, className, defaultOpenId = null, onOpenChange, openId }) {
6
+ const [uncontrolledOpenId, setUncontrolledOpenId] = useState(defaultOpenId);
7
+ const isControlled = openId !== void 0;
8
+ const currentOpenId = isControlled ? openId : uncontrolledOpenId;
9
+ const isOpen = useCallback((id) => currentOpenId === id, [currentOpenId]);
10
+ const toggle = useCallback((id) => {
11
+ const nextOpenId = currentOpenId === id ? null : id;
12
+ if (!isControlled) setUncontrolledOpenId(nextOpenId);
13
+ onOpenChange?.(nextOpenId);
14
+ }, [
15
+ currentOpenId,
16
+ isControlled,
17
+ onOpenChange
18
+ ]);
19
+ const contextValue = useMemo(() => ({
20
+ isOpen,
21
+ toggle
22
+ }), [isOpen, toggle]);
23
+ const rootClassName = ["chayns-accordion-group", className].filter(Boolean).join(" ");
24
+ return /* @__PURE__ */ jsx(AccordionGroupContext.Provider, {
25
+ value: contextValue,
26
+ children: /* @__PURE__ */ jsx("div", {
27
+ className: rootClassName,
28
+ children
29
+ })
30
+ });
31
+ }
32
+ //#endregion
33
+ export { AccordionGroup as default };
34
+
35
+ //# sourceMappingURL=AccordionGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionGroup.js","names":[],"sources":["../../../src/components/accordion/AccordionGroup.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\n\nimport { AccordionGroupContext } from './AccordionContext.js';\nimport type { AccordionGroupContextValue } from './AccordionContext.js';\nimport type { AccordionGroupProps } from './Accordion.types.js';\n\nfunction AccordionGroup({\n children,\n className,\n defaultOpenId = null,\n onOpenChange,\n openId,\n}: AccordionGroupProps) {\n const [uncontrolledOpenId, setUncontrolledOpenId] = useState<string | null>(defaultOpenId);\n\n const isControlled = openId !== undefined;\n const currentOpenId = isControlled ? openId : uncontrolledOpenId;\n\n const isOpen = useCallback((id: string) => currentOpenId === id, [currentOpenId]);\n\n const toggle = useCallback(\n (id: string) => {\n const nextOpenId = currentOpenId === id ? null : id;\n if (!isControlled) setUncontrolledOpenId(nextOpenId);\n onOpenChange?.(nextOpenId);\n },\n [currentOpenId, isControlled, onOpenChange],\n );\n\n const contextValue = useMemo<AccordionGroupContextValue>(\n () => ({ isOpen, toggle }),\n [isOpen, toggle],\n );\n\n const rootClassName = ['chayns-accordion-group', className].filter(Boolean).join(' ');\n\n return (\n <AccordionGroupContext.Provider value={contextValue}>\n <div className={rootClassName}>{children}</div>\n </AccordionGroupContext.Provider>\n );\n}\n\nexport default AccordionGroup;\n"],"mappings":";;;;AAMA,SAAS,eAAe,EACtB,UACA,WACA,gBAAgB,MAChB,cACA,UACsB;CACtB,MAAM,CAAC,oBAAoB,yBAAyB,SAAwB,aAAa;CAEzF,MAAM,eAAe,WAAW,KAAA;CAChC,MAAM,gBAAgB,eAAe,SAAS;CAE9C,MAAM,SAAS,aAAa,OAAe,kBAAkB,IAAI,CAAC,aAAa,CAAC;CAEhF,MAAM,SAAS,aACZ,OAAe;EACd,MAAM,aAAa,kBAAkB,KAAK,OAAO;EACjD,IAAI,CAAC,cAAc,sBAAsB,UAAU;EACnD,eAAe,UAAU;CAC3B,GACA;EAAC;EAAe;EAAc;CAAY,CAC5C;CAEA,MAAM,eAAe,eACZ;EAAE;EAAQ;CAAO,IACxB,CAAC,QAAQ,MAAM,CACjB;CAEA,MAAM,gBAAgB,CAAC,0BAA0B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEpF,OACE,oBAAC,sBAAsB,UAAvB;EAAgC,OAAO;EACrC,UAAA,oBAAC,OAAD;GAAK,WAAW;GAAgB;EAAc,CAAA;CAChB,CAAA;AAEpC"}
@@ -0,0 +1,4 @@
1
+ export { default as Accordion } from './Accordion.js';
2
+ export { default as AccordionGroup } from './AccordionGroup.js';
3
+ export type { AccordionGroupProps, AccordionProps } from './Accordion.types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import Accordion from "./Accordion.js";
2
+ import AccordionGroup from "./AccordionGroup.js";
3
+ export { Accordion, AccordionGroup };
@@ -0,0 +1,4 @@
1
+ import type { ButtonProps } from './Button.types.js';
2
+ declare function Button({ children, className, icon, type, variant, ...buttonProps }: ButtonProps): import("react").JSX.Element;
3
+ export default Button;
4
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,iBAAS,MAAM,CAAC,EACd,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,IAAe,EACf,OAAO,EACP,GAAG,WAAW,EACf,EAAE,WAAW,+BASb;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,17 @@
1
+ import ButtonIcon from "./ButtonIcon.js";
2
+ import { getButtonClassName } from "./buttonClassName.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/button/Button.tsx
5
+ function Button({ children, className, icon, type = "button", variant, ...buttonProps }) {
6
+ const resolvedClassName = getButtonClassName("chayns-button", variant, className);
7
+ return /* @__PURE__ */ jsxs("button", {
8
+ ...buttonProps,
9
+ className: resolvedClassName,
10
+ type,
11
+ children: [icon ? /* @__PURE__ */ jsx(ButtonIcon, { icon }) : null, children]
12
+ });
13
+ }
14
+ //#endregion
15
+ export { Button as default };
16
+
17
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/button/Button.tsx"],"sourcesContent":["import type { ButtonProps } from './Button.types.js';\nimport ButtonIcon from './ButtonIcon.js';\nimport { getButtonClassName } from './buttonClassName.js';\n\nfunction Button({\n children,\n className,\n icon,\n type = 'button',\n variant,\n ...buttonProps\n}: ButtonProps) {\n const resolvedClassName = getButtonClassName('chayns-button', variant, className);\n\n return (\n <button {...buttonProps} className={resolvedClassName} type={type}>\n {icon ? <ButtonIcon icon={icon} /> : null}\n {children}\n </button>\n );\n}\n\nexport default Button;\n"],"mappings":";;;;AAIA,SAAS,OAAO,EACd,UACA,WACA,MACA,OAAO,UACP,SACA,GAAG,eACW;CACd,MAAM,oBAAoB,mBAAmB,iBAAiB,SAAS,SAAS;CAEhF,OACE,qBAAC,UAAD;EAAQ,GAAI;EAAa,WAAW;EAAyB;EAA7D,UAAA,CACG,OAAO,oBAAC,YAAD,EAAkB,KAAO,CAAA,IAAI,MACpC,QACK;;AAEZ"}