@nuralyui/radio-group 0.0.6
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/bundle.js +1548 -0
- package/index.d.ts +3 -0
- package/index.js +3 -0
- package/index.js.map +1 -0
- package/package.json +29 -0
- package/radio-group.component.d.ts +149 -0
- package/radio-group.component.js +402 -0
- package/radio-group.component.js.map +1 -0
- package/radio-group.style.d.ts +7 -0
- package/radio-group.style.js +196 -0
- package/radio-group.style.js.map +1 -0
- package/radio-group.types.d.ts +37 -0
- package/radio-group.types.js +28 -0
- package/radio-group.types.js.map +1 -0
- package/radio.component.d.ts +146 -0
- package/radio.component.js +394 -0
- package/radio.component.js.map +1 -0
- package/radio.constant.d.ts +2 -0
- package/radio.constant.js +2 -0
- package/radio.constant.js.map +1 -0
- package/radio.style.d.ts +7 -0
- package/radio.style.js +339 -0
- package/radio.style.js.map +1 -0
- package/radio.type.d.ts +37 -0
- package/radio.type.js +28 -0
- package/radio.type.js.map +1 -0
- package/react.d.ts +10 -0
- package/react.js +17 -0
- package/react.js.map +1 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { css } from 'lit';
|
|
7
|
+
export const styles = css `
|
|
8
|
+
:host {
|
|
9
|
+
/* ========================================
|
|
10
|
+
* CSS CUSTOM PROPERTIES - RADIO GROUP
|
|
11
|
+
* ======================================== */
|
|
12
|
+
|
|
13
|
+
/* Group Layout */
|
|
14
|
+
--nuraly-radio-group-gap: 12px;
|
|
15
|
+
--nuraly-radio-group-horizontal-gap: 16px;
|
|
16
|
+
|
|
17
|
+
/* Colors - Error/Warning states */
|
|
18
|
+
--nuraly-radio-group-error-icon-color: var(--nuraly-color-radio-error-icon, #ef4444);
|
|
19
|
+
--nuraly-radio-group-error-text-color: var(--nuraly-color-radio-error-text, #ef4444);
|
|
20
|
+
--nuraly-radio-group-warning-icon-color: var(--nuraly-color-radio-warning-icon, #f59e0b);
|
|
21
|
+
--nuraly-radio-group-warning-text-color: var(--nuraly-color-radio-warning-text, #f59e0b);
|
|
22
|
+
|
|
23
|
+
/* Typography */
|
|
24
|
+
--nuraly-radio-group-font-family: var(--nuraly-font-family-radio, Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif);
|
|
25
|
+
--nuraly-radio-group-message-font-size: var(--nuraly-font-size-radio-message, 12px);
|
|
26
|
+
|
|
27
|
+
/* Button type styling */
|
|
28
|
+
--nuraly-radio-group-button-border-radius: 4px;
|
|
29
|
+
--nuraly-radio-group-button-hover-color: var(--nuraly-color-radio-border-hover, #7c3aed);
|
|
30
|
+
|
|
31
|
+
/* Slot container styling */
|
|
32
|
+
--nuraly-radio-group-slot-hover-bg: rgba(124, 58, 237, 0.04);
|
|
33
|
+
--nuraly-radio-group-slot-selected-bg: rgba(124, 58, 237, 0.08);
|
|
34
|
+
--nuraly-radio-group-slot-border-radius: 6px;
|
|
35
|
+
|
|
36
|
+
/* ========================================
|
|
37
|
+
* COMPONENT STYLES
|
|
38
|
+
* ======================================== */
|
|
39
|
+
|
|
40
|
+
width: fit-content;
|
|
41
|
+
display: block;
|
|
42
|
+
font-family: var(--nuraly-radio-group-font-family);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ========================================
|
|
46
|
+
* RADIO GROUP LAYOUT
|
|
47
|
+
* ======================================== */
|
|
48
|
+
|
|
49
|
+
.radio-group {
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
gap: var(--nuraly-radio-group-gap);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.radio-group.horizontal {
|
|
56
|
+
flex-direction: row;
|
|
57
|
+
flex-wrap: wrap;
|
|
58
|
+
gap: var(--nuraly-radio-group-horizontal-gap);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.radio-wrapper {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: 4px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* ========================================
|
|
68
|
+
* MESSAGE CONTAINERS (Error/Warning)
|
|
69
|
+
* ======================================== */
|
|
70
|
+
|
|
71
|
+
.radio-wrapper .message-container {
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: 6px;
|
|
75
|
+
font-size: var(--nuraly-radio-group-message-font-size);
|
|
76
|
+
padding-left: 28px; /* Align with radio label */
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
nr-icon {
|
|
80
|
+
display: flex;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.radio-wrapper.error nr-icon {
|
|
84
|
+
--nuraly-icon-color: var(--nuraly-radio-group-error-icon-color);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.radio-wrapper.warning nr-icon {
|
|
88
|
+
--nuraly-icon-color: var(--nuraly-radio-group-warning-icon-color);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.radio-wrapper.error .message-container {
|
|
92
|
+
color: var(--nuraly-radio-group-error-text-color);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.radio-wrapper.warning .message-container {
|
|
96
|
+
color: var(--nuraly-radio-group-warning-text-color);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ========================================
|
|
100
|
+
* BUTTON TYPE STYLING
|
|
101
|
+
* ======================================== */
|
|
102
|
+
|
|
103
|
+
.type-button {
|
|
104
|
+
display: inline-flex;
|
|
105
|
+
gap: 0px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Button border radius for first and last child */
|
|
109
|
+
.type-button :first-child {
|
|
110
|
+
--nuraly-button-border-top-left-radius: var(--nuraly-radio-group-button-border-radius);
|
|
111
|
+
--nuraly-button-border-bottom-left-radius: var(--nuraly-radio-group-button-border-radius);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.type-button :last-child {
|
|
115
|
+
--nuraly-button-border-top-right-radius: var(--nuraly-radio-group-button-border-radius);
|
|
116
|
+
--nuraly-button-border-bottom-right-radius: var(--nuraly-radio-group-button-border-radius);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.type-button nr-button:not(:last-child) {
|
|
120
|
+
margin-right: -1px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.type-button nr-button {
|
|
124
|
+
position: relative;
|
|
125
|
+
z-index: 1;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.type-button nr-button[type="default"]:hover {
|
|
129
|
+
--nuraly-button-color: var(--nuraly-radio-group-button-hover-color);
|
|
130
|
+
--nuraly-button-border-color: var(--nuraly-radio-group-button-hover-color);
|
|
131
|
+
z-index: 2;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.type-button nr-button[type="primary"] {
|
|
135
|
+
z-index: 1;
|
|
136
|
+
position: relative;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Disabled button states */
|
|
140
|
+
.type-button nr-button[disabled] {
|
|
141
|
+
opacity: 0.6;
|
|
142
|
+
cursor: not-allowed;
|
|
143
|
+
pointer-events: none;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.type-button nr-button[disabled]:hover {
|
|
147
|
+
z-index: auto;
|
|
148
|
+
--nuraly-button-border-color: var(--nuraly-button-disabled-border-color, var(--nuraly-button-local-disabled-border-color));
|
|
149
|
+
--nuraly-button-background-color: var(--nuraly-button-disabled-background-color, var(--nuraly-button-local-disabled-background-color));
|
|
150
|
+
--nuraly-button-color: var(--nuraly-button-disabled-text-color, var(--nuraly-button-local-disabled-text-color));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.type-button nr-button[type="primary"][disabled] {
|
|
154
|
+
--nuraly-button-background-color: var(--nuraly-button-primary-disabled-background-color, var(--nuraly-button-local-primary-disabled-background-color));
|
|
155
|
+
--nuraly-button-border-color: var(--nuraly-button-primary-disabled-border-color, var(--nuraly-button-local-primary-disabled-border-color));
|
|
156
|
+
--nuraly-button-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.type-button nr-button[type="primary"][disabled] nr-icon {
|
|
160
|
+
--nuraly-icon-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));
|
|
161
|
+
--nuraly-icon-local-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* ========================================
|
|
165
|
+
* SLOT-BASED RADIO STYLING
|
|
166
|
+
* ======================================== */
|
|
167
|
+
|
|
168
|
+
.slot-wrapper {
|
|
169
|
+
display: flex;
|
|
170
|
+
align-items: flex-start;
|
|
171
|
+
gap: 12px;
|
|
172
|
+
cursor: pointer;
|
|
173
|
+
transition: all 0.2s ease;
|
|
174
|
+
padding: 8px;
|
|
175
|
+
border-radius: var(--nuraly-radio-group-slot-border-radius);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.slot-wrapper:hover {
|
|
179
|
+
background-color: var(--nuraly-radio-group-slot-hover-bg);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.slot-wrapper nr-radio {
|
|
183
|
+
flex-shrink: 0;
|
|
184
|
+
margin-top: 2px;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.slot-wrapper .slot-content {
|
|
188
|
+
flex: 1;
|
|
189
|
+
min-width: 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.slot-container.selected .slot-wrapper {
|
|
193
|
+
background-color: var(--nuraly-radio-group-slot-selected-bg);
|
|
194
|
+
}
|
|
195
|
+
`;
|
|
196
|
+
//# sourceMappingURL=radio-group.style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio-group.style.js","sourceRoot":"","sources":["../../../src/components/radio-group/radio-group.style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4LxB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { css } from 'lit';\n\nexport const styles = css`\n :host {\n /* ========================================\n * CSS CUSTOM PROPERTIES - RADIO GROUP\n * ======================================== */\n \n /* Group Layout */\n --nuraly-radio-group-gap: 12px;\n --nuraly-radio-group-horizontal-gap: 16px;\n\n /* Colors - Error/Warning states */\n --nuraly-radio-group-error-icon-color: var(--nuraly-color-radio-error-icon, #ef4444);\n --nuraly-radio-group-error-text-color: var(--nuraly-color-radio-error-text, #ef4444);\n --nuraly-radio-group-warning-icon-color: var(--nuraly-color-radio-warning-icon, #f59e0b);\n --nuraly-radio-group-warning-text-color: var(--nuraly-color-radio-warning-text, #f59e0b);\n\n /* Typography */\n --nuraly-radio-group-font-family: var(--nuraly-font-family-radio, Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif);\n --nuraly-radio-group-message-font-size: var(--nuraly-font-size-radio-message, 12px);\n\n /* Button type styling */\n --nuraly-radio-group-button-border-radius: 4px;\n --nuraly-radio-group-button-hover-color: var(--nuraly-color-radio-border-hover, #7c3aed);\n\n /* Slot container styling */\n --nuraly-radio-group-slot-hover-bg: rgba(124, 58, 237, 0.04);\n --nuraly-radio-group-slot-selected-bg: rgba(124, 58, 237, 0.08);\n --nuraly-radio-group-slot-border-radius: 6px;\n\n /* ========================================\n * COMPONENT STYLES\n * ======================================== */\n \n width: fit-content;\n display: block;\n font-family: var(--nuraly-radio-group-font-family);\n }\n\n /* ========================================\n * RADIO GROUP LAYOUT\n * ======================================== */\n\n .radio-group {\n display: flex;\n flex-direction: column;\n gap: var(--nuraly-radio-group-gap);\n }\n\n .radio-group.horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--nuraly-radio-group-horizontal-gap);\n }\n\n .radio-wrapper {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n /* ========================================\n * MESSAGE CONTAINERS (Error/Warning)\n * ======================================== */\n\n .radio-wrapper .message-container {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: var(--nuraly-radio-group-message-font-size);\n padding-left: 28px; /* Align with radio label */\n }\n\n nr-icon {\n display: flex;\n }\n\n .radio-wrapper.error nr-icon {\n --nuraly-icon-color: var(--nuraly-radio-group-error-icon-color);\n }\n\n .radio-wrapper.warning nr-icon {\n --nuraly-icon-color: var(--nuraly-radio-group-warning-icon-color);\n }\n\n .radio-wrapper.error .message-container {\n color: var(--nuraly-radio-group-error-text-color);\n }\n\n .radio-wrapper.warning .message-container {\n color: var(--nuraly-radio-group-warning-text-color);\n }\n\n /* ========================================\n * BUTTON TYPE STYLING\n * ======================================== */\n\n .type-button {\n display: inline-flex;\n gap: 0px;\n }\n\n /* Button border radius for first and last child */\n .type-button :first-child {\n --nuraly-button-border-top-left-radius: var(--nuraly-radio-group-button-border-radius);\n --nuraly-button-border-bottom-left-radius: var(--nuraly-radio-group-button-border-radius);\n }\n\n .type-button :last-child {\n --nuraly-button-border-top-right-radius: var(--nuraly-radio-group-button-border-radius);\n --nuraly-button-border-bottom-right-radius: var(--nuraly-radio-group-button-border-radius);\n }\n\n .type-button nr-button:not(:last-child) {\n margin-right: -1px;\n }\n\n .type-button nr-button {\n position: relative;\n z-index: 1;\n }\n\n .type-button nr-button[type=\"default\"]:hover {\n --nuraly-button-color: var(--nuraly-radio-group-button-hover-color);\n --nuraly-button-border-color: var(--nuraly-radio-group-button-hover-color);\n z-index: 2;\n }\n\n .type-button nr-button[type=\"primary\"] {\n z-index: 1;\n position: relative;\n }\n\n /* Disabled button states */\n .type-button nr-button[disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n .type-button nr-button[disabled]:hover {\n z-index: auto;\n --nuraly-button-border-color: var(--nuraly-button-disabled-border-color, var(--nuraly-button-local-disabled-border-color));\n --nuraly-button-background-color: var(--nuraly-button-disabled-background-color, var(--nuraly-button-local-disabled-background-color));\n --nuraly-button-color: var(--nuraly-button-disabled-text-color, var(--nuraly-button-local-disabled-text-color));\n }\n\n .type-button nr-button[type=\"primary\"][disabled] {\n --nuraly-button-background-color: var(--nuraly-button-primary-disabled-background-color, var(--nuraly-button-local-primary-disabled-background-color));\n --nuraly-button-border-color: var(--nuraly-button-primary-disabled-border-color, var(--nuraly-button-local-primary-disabled-border-color));\n --nuraly-button-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));\n }\n\n .type-button nr-button[type=\"primary\"][disabled] nr-icon {\n --nuraly-icon-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));\n --nuraly-icon-local-color: var(--nuraly-button-primary-disabled-text-color, var(--nuraly-button-local-primary-disabled-text-color));\n }\n\n /* ========================================\n * SLOT-BASED RADIO STYLING\n * ======================================== */\n\n .slot-wrapper {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n padding: 8px;\n border-radius: var(--nuraly-radio-group-slot-border-radius);\n }\n\n .slot-wrapper:hover {\n background-color: var(--nuraly-radio-group-slot-hover-bg);\n }\n\n .slot-wrapper nr-radio {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .slot-wrapper .slot-content {\n flex: 1;\n min-width: 0;\n }\n\n .slot-container.selected .slot-wrapper {\n background-color: var(--nuraly-radio-group-slot-selected-bg);\n }\n`;\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare type RadioButtonOption = {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
icon?: string;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
state?: RadioButtonState;
|
|
7
|
+
message?: string;
|
|
8
|
+
htmlContent?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
id?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare type RadioButtonState = 'error' | 'warning';
|
|
15
|
+
export declare enum RadioButtonDirection {
|
|
16
|
+
Horizontal = "horizontal",
|
|
17
|
+
Vertical = "vertical"
|
|
18
|
+
}
|
|
19
|
+
export declare enum RadioButtonPosition {
|
|
20
|
+
Left = "left",
|
|
21
|
+
Right = "right"
|
|
22
|
+
}
|
|
23
|
+
export declare enum RadioButtonType {
|
|
24
|
+
Default = "default",
|
|
25
|
+
Button = "button",
|
|
26
|
+
Slot = "slot"
|
|
27
|
+
}
|
|
28
|
+
export declare enum RadioButtonSize {
|
|
29
|
+
Small = "small",
|
|
30
|
+
Medium = "medium",
|
|
31
|
+
Large = "large"
|
|
32
|
+
}
|
|
33
|
+
export declare enum RadioButtonVariant {
|
|
34
|
+
Default = "default",
|
|
35
|
+
Solid = "solid"
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=radio-group.types.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export var RadioButtonDirection;
|
|
2
|
+
(function (RadioButtonDirection) {
|
|
3
|
+
RadioButtonDirection["Horizontal"] = "horizontal";
|
|
4
|
+
RadioButtonDirection["Vertical"] = "vertical";
|
|
5
|
+
})(RadioButtonDirection || (RadioButtonDirection = {}));
|
|
6
|
+
export var RadioButtonPosition;
|
|
7
|
+
(function (RadioButtonPosition) {
|
|
8
|
+
RadioButtonPosition["Left"] = "left";
|
|
9
|
+
RadioButtonPosition["Right"] = "right";
|
|
10
|
+
})(RadioButtonPosition || (RadioButtonPosition = {}));
|
|
11
|
+
export var RadioButtonType;
|
|
12
|
+
(function (RadioButtonType) {
|
|
13
|
+
RadioButtonType["Default"] = "default";
|
|
14
|
+
RadioButtonType["Button"] = "button";
|
|
15
|
+
RadioButtonType["Slot"] = "slot";
|
|
16
|
+
})(RadioButtonType || (RadioButtonType = {}));
|
|
17
|
+
export var RadioButtonSize;
|
|
18
|
+
(function (RadioButtonSize) {
|
|
19
|
+
RadioButtonSize["Small"] = "small";
|
|
20
|
+
RadioButtonSize["Medium"] = "medium";
|
|
21
|
+
RadioButtonSize["Large"] = "large";
|
|
22
|
+
})(RadioButtonSize || (RadioButtonSize = {}));
|
|
23
|
+
export var RadioButtonVariant;
|
|
24
|
+
(function (RadioButtonVariant) {
|
|
25
|
+
RadioButtonVariant["Default"] = "default";
|
|
26
|
+
RadioButtonVariant["Solid"] = "solid";
|
|
27
|
+
})(RadioButtonVariant || (RadioButtonVariant = {}));
|
|
28
|
+
//# sourceMappingURL=radio-group.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio-group.types.js","sourceRoot":"","sources":["../../../src/components/radio-group/radio-group.types.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAN,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,iDAAyB,CAAA;IACzB,6CAAqB,CAAA;AACvB,CAAC,EAHW,oBAAoB,KAApB,oBAAoB,QAG/B;AAED,MAAM,CAAN,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC7B,oCAAa,CAAA;IACb,sCAAe,CAAA;AACjB,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,QAG9B;AAED,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,sCAAmB,CAAA;IACnB,oCAAiB,CAAA;IACjB,gCAAa,CAAA;AACf,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,oCAAiB,CAAA;IACjB,kCAAe,CAAA;AACjB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B","sourcesContent":["export type RadioButtonOption = {\n value: string;\n label: string;\n icon?: string;\n disabled?: boolean;\n state?: RadioButtonState;\n message?: string;\n htmlContent?: string; // Support for HTML content instead of plain label\n className?: string; // Custom CSS class for the option\n style?: string; // Inline styles for the option\n title?: string; // Tooltip text\n id?: string; // Custom ID for the option\n};\n\nexport type RadioButtonState = 'error' | 'warning';\n\nexport enum RadioButtonDirection {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\nexport enum RadioButtonPosition {\n Left = 'left',\n Right = 'right',\n}\n\nexport enum RadioButtonType {\n Default = 'default',\n Button = 'button',\n Slot = 'slot',\n}\n\nexport enum RadioButtonSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport enum RadioButtonVariant {\n Default = 'default',\n Solid = 'solid',\n}\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { LitElement } from 'lit';
|
|
7
|
+
import '../icon/icon.component.js';
|
|
8
|
+
import '../button/button.component.js';
|
|
9
|
+
import { RadioButtonType, RadioButtonOption } from './radio.type.js';
|
|
10
|
+
declare const NrRadioGroupElement_base: (new (...args: any[]) => import("../../shared/dependency-mixin.js").DependencyAware) & (new (...args: any[]) => import("../../shared/theme-mixin.js").ThemeAware) & (new (...args: any[]) => import("../../shared/event-handler-mixin.js").EventHandlerCapable) & typeof LitElement;
|
|
11
|
+
/**
|
|
12
|
+
* A radio button group component using Reactive Controllers architecture.
|
|
13
|
+
*
|
|
14
|
+
* Supports multiple display modes:
|
|
15
|
+
* - Default: Traditional radio buttons with labels
|
|
16
|
+
* - Button: Button-style radio group
|
|
17
|
+
* - Slot: Custom HTML content with radio selection
|
|
18
|
+
*
|
|
19
|
+
* Features:
|
|
20
|
+
* - Theme-aware styling with light/dark mode support
|
|
21
|
+
* - Keyboard navigation (arrow keys, space, enter)
|
|
22
|
+
* - Accessibility compliance
|
|
23
|
+
* - Form validation and integration
|
|
24
|
+
* - Ripple effects on interaction
|
|
25
|
+
* - Modular controller-based architecture
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```html
|
|
29
|
+
* <nr-radio-group
|
|
30
|
+
* .options='[
|
|
31
|
+
* { value: "option1", label: "Option 1" },
|
|
32
|
+
* { value: "option2", label: "Option 2" }
|
|
33
|
+
* ]'
|
|
34
|
+
* default-value="option1"
|
|
35
|
+
* direction="horizontal">
|
|
36
|
+
* </nr-radio-group>
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @fires change - Dispatched when the selected option changes
|
|
40
|
+
*/
|
|
41
|
+
export declare class NrRadioGroupElement extends NrRadioGroupElement_base {
|
|
42
|
+
static styles: import("lit").CSSResult;
|
|
43
|
+
requiredComponents: string[];
|
|
44
|
+
options: RadioButtonOption[];
|
|
45
|
+
defaultValue: string;
|
|
46
|
+
value: string;
|
|
47
|
+
name: string;
|
|
48
|
+
direction: 'horizontal' | 'vertical';
|
|
49
|
+
type: RadioButtonType;
|
|
50
|
+
required: boolean;
|
|
51
|
+
disabled: boolean;
|
|
52
|
+
private groupController;
|
|
53
|
+
private keyboardController;
|
|
54
|
+
private focusController;
|
|
55
|
+
private validationController;
|
|
56
|
+
private rippleController;
|
|
57
|
+
/**
|
|
58
|
+
* Get the currently selected option - DELEGATES to controller
|
|
59
|
+
*/
|
|
60
|
+
get selectedOption(): RadioButtonOption | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Check if an option is selected - DELEGATES to controller
|
|
63
|
+
*/
|
|
64
|
+
isOptionSelected(option: RadioButtonOption): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if an option is disabled - DELEGATES to controller
|
|
67
|
+
*/
|
|
68
|
+
isOptionDisabled(option: RadioButtonOption): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Handle option selection change - DELEGATES to controller
|
|
71
|
+
*/
|
|
72
|
+
handleSelectionChange(option: RadioButtonOption): void;
|
|
73
|
+
/**
|
|
74
|
+
* Set focused option by index - DELEGATES to controller
|
|
75
|
+
*/
|
|
76
|
+
setFocusedOption(index: number): void;
|
|
77
|
+
/**
|
|
78
|
+
* Handle keyboard events - DELEGATES to controller
|
|
79
|
+
*/
|
|
80
|
+
handleKeyDown(_event: KeyboardEvent): void;
|
|
81
|
+
/**
|
|
82
|
+
* Add ripple effect on radio input click - DELEGATES to controller
|
|
83
|
+
*/
|
|
84
|
+
addRippleEffect(event: Event): void;
|
|
85
|
+
/**
|
|
86
|
+
* Validate the radio group - DELEGATES to controller
|
|
87
|
+
*/
|
|
88
|
+
validate(): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Get validation message - DELEGATES to controller
|
|
91
|
+
*/
|
|
92
|
+
get validationMessage(): string;
|
|
93
|
+
/**
|
|
94
|
+
* Check if the radio group is valid - DELEGATES to controller
|
|
95
|
+
*/
|
|
96
|
+
get isValid(): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Get form data for form submission - DELEGATES to controller
|
|
99
|
+
*/
|
|
100
|
+
getFormData(): {
|
|
101
|
+
[key: string]: string;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Reset the radio group - DELEGATES to controller
|
|
105
|
+
*/
|
|
106
|
+
reset(): void;
|
|
107
|
+
/**
|
|
108
|
+
* FormData integration for native form submission - DELEGATES to controller
|
|
109
|
+
*/
|
|
110
|
+
get formData(): FormData | null;
|
|
111
|
+
/**
|
|
112
|
+
* Check form validity (required for HTML5 form validation)
|
|
113
|
+
*/
|
|
114
|
+
checkValidity(): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Report form validity (required for HTML5 form validation) - DELEGATES to controller
|
|
117
|
+
*/
|
|
118
|
+
reportValidity(): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Programmatically focus the radio group - DELEGATES to controller
|
|
121
|
+
*/
|
|
122
|
+
focus(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Programmatically blur the radio group - DELEGATES to controller
|
|
125
|
+
*/
|
|
126
|
+
blur(): void;
|
|
127
|
+
/**
|
|
128
|
+
* Render default radio button style
|
|
129
|
+
*/
|
|
130
|
+
private renderOptionDefault;
|
|
131
|
+
/**
|
|
132
|
+
* Render button style radio group
|
|
133
|
+
*/
|
|
134
|
+
private renderOptionsWithButtons;
|
|
135
|
+
/**
|
|
136
|
+
* Render slot-based radio group (for custom HTML content)
|
|
137
|
+
*/
|
|
138
|
+
private renderOptionsWithSlots;
|
|
139
|
+
/**
|
|
140
|
+
* Render button style with slots
|
|
141
|
+
*/
|
|
142
|
+
private renderButtonsWithSlots;
|
|
143
|
+
protected render(): import("lit").TemplateResult<1>;
|
|
144
|
+
}
|
|
145
|
+
export {};
|
|
146
|
+
//# sourceMappingURL=radio.component.d.ts.map
|