@rokkit/core 1.0.0-next.13 → 1.0.0-next.131

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 (93) hide show
  1. package/dist/calendar.d.ts +10 -0
  2. package/dist/colors/index.d.ts +47 -0
  3. package/dist/connector.d.ts +8 -0
  4. package/dist/constants.d.ts +88 -0
  5. package/dist/events.d.ts +12 -0
  6. package/dist/field-mapper.d.ts +60 -0
  7. package/dist/index.d.ts +13 -0
  8. package/dist/key-event-map.d.ts +18 -0
  9. package/dist/mapped-items.d.ts +14 -0
  10. package/dist/mapping.d.ts +14 -0
  11. package/dist/nested.d.ts +9 -0
  12. package/dist/string.d.ts +59 -0
  13. package/dist/theme.d.ts +96 -0
  14. package/dist/ticks.d.ts +10 -0
  15. package/dist/types.d.ts +300 -0
  16. package/dist/utils.d.ts +107 -0
  17. package/dist/vite/icon-collections.d.ts +32 -0
  18. package/dist/vite/index.d.ts +1 -0
  19. package/package.json +25 -39
  20. package/src/calendar.js +44 -0
  21. package/src/colors/extra.json +16 -0
  22. package/src/colors/index.ts +24 -0
  23. package/src/colors/syntax.json +42 -0
  24. package/src/colors/tailwind.json +275 -0
  25. package/src/connector.js +34 -0
  26. package/src/constants.js +181 -107
  27. package/src/events.js +32 -0
  28. package/src/field-mapper.js +147 -0
  29. package/src/index.js +19 -27
  30. package/src/key-event-map.js +36 -0
  31. package/src/mapped-items.js +22 -0
  32. package/src/mapping.js +21 -0
  33. package/src/nested.js +28 -0
  34. package/src/string.js +97 -0
  35. package/src/theme.ts +192 -0
  36. package/src/ticks.js +26 -0
  37. package/src/types.js +160 -0
  38. package/src/utils.js +250 -0
  39. package/src/vite/icon-collections.js +73 -0
  40. package/src/vite/index.js +1 -0
  41. package/LICENSE +0 -21
  42. package/README.md +0 -1
  43. package/src/Accordion.svelte +0 -80
  44. package/src/Alerts.svelte +0 -39
  45. package/src/DropDown.svelte +0 -82
  46. package/src/DropSearch.svelte +0 -67
  47. package/src/EditableTabs.svelte +0 -31
  48. package/src/Icon.svelte +0 -15
  49. package/src/List-Discard.svelte +0 -48
  50. package/src/List.svelte +0 -65
  51. package/src/ListActions.svelte +0 -35
  52. package/src/NavTabs.svelte +0 -0
  53. package/src/NestedList.svelte +0 -77
  54. package/src/Overlay.svelte +0 -4
  55. package/src/PageNavigator.svelte +0 -94
  56. package/src/ResponsiveGrid.svelte +0 -73
  57. package/src/Scrollable.svelte +0 -8
  58. package/src/Searchable.svelte +0 -19
  59. package/src/Sidebar.svelte +0 -5
  60. package/src/Slider.svelte +0 -17
  61. package/src/SpinList.svelte +0 -48
  62. package/src/SplitPane.svelte +0 -109
  63. package/src/SplitView.svelte +0 -44
  64. package/src/Splitter.svelte +0 -95
  65. package/src/TabItem.svelte +0 -27
  66. package/src/TabItems.svelte +0 -34
  67. package/src/Tabs.svelte +0 -49
  68. package/src/Tree.svelte +0 -45
  69. package/src/actions/dismissable.js +0 -24
  70. package/src/actions/fillable.js +0 -114
  71. package/src/actions/hierarchy.js +0 -189
  72. package/src/actions/index.js +0 -7
  73. package/src/actions/navigable.js +0 -43
  74. package/src/actions/navigator.js +0 -179
  75. package/src/actions/pannable.js +0 -50
  76. package/src/actions/swipeable.js +0 -56
  77. package/src/actions/themeable.js +0 -23
  78. package/src/items/Collapsible.svelte +0 -51
  79. package/src/items/Connector.svelte +0 -26
  80. package/src/items/Link.svelte +0 -18
  81. package/src/items/Node.svelte +0 -52
  82. package/src/items/Pill.svelte +0 -19
  83. package/src/items/Separator.svelte +0 -1
  84. package/src/items/Summary.svelte +0 -27
  85. package/src/items/Text.svelte +0 -21
  86. package/src/items/index.js +0 -8
  87. package/src/list.js +0 -14
  88. package/src/mocks/Custom.svelte +0 -7
  89. package/src/mocks/index.js +0 -10
  90. package/src/stores/alerts.js +0 -3
  91. package/src/stores/index.js +0 -6
  92. package/src/stores/persist.js +0 -63
  93. package/src/stores/theme.js +0 -34
@@ -0,0 +1,275 @@
1
+ {
2
+ "amber": {
3
+ "50": "#fffbeb",
4
+ "100": "#fef3c7",
5
+ "200": "#fde68a",
6
+ "300": "#fcd34d",
7
+ "400": "#fbbf24",
8
+ "500": "#f59e0b",
9
+ "600": "#d97706",
10
+ "700": "#b45309",
11
+ "800": "#92400e",
12
+ "900": "#78350f",
13
+ "950": "#451a03"
14
+ },
15
+ "blue": {
16
+ "50": "#eff6ff",
17
+ "100": "#dbeafe",
18
+ "200": "#bfdbfe",
19
+ "300": "#93c5fd",
20
+ "400": "#60a5fa",
21
+ "500": "#3b82f6",
22
+ "600": "#2563eb",
23
+ "700": "#1d4ed8",
24
+ "800": "#1e40af",
25
+ "900": "#1e3a8a",
26
+ "950": "#172554"
27
+ },
28
+ "cyan": {
29
+ "50": "#ecfeff",
30
+ "100": "#cffafe",
31
+ "200": "#a5f3fc",
32
+ "300": "#67e8f9",
33
+ "400": "#22d3ee",
34
+ "500": "#06b6d4",
35
+ "600": "#0891b2",
36
+ "700": "#0e7490",
37
+ "800": "#155e75",
38
+ "900": "#164e63",
39
+ "950": "#083344"
40
+ },
41
+ "emerald": {
42
+ "50": "#ecfdf5",
43
+ "100": "#d1fae5",
44
+ "200": "#a7f3d0",
45
+ "300": "#6ee7b7",
46
+ "400": "#34d399",
47
+ "500": "#10b981",
48
+ "600": "#059669",
49
+ "700": "#047857",
50
+ "800": "#065f46",
51
+ "900": "#064e3b",
52
+ "950": "#022c22"
53
+ },
54
+ "fuscia": {
55
+ "50": "#fdf4ff",
56
+ "100": "#fae8ff",
57
+ "200": "#f5d0fe",
58
+ "300": "#f0abfc",
59
+ "400": "#e879f9",
60
+ "500": "#d946ef",
61
+ "600": "#c026d3",
62
+ "700": "#a21caf",
63
+ "800": "#86198f",
64
+ "900": "#701a75",
65
+ "950": "#4a044e"
66
+ },
67
+ "gray": {
68
+ "50": "#f9fafb",
69
+ "100": "#f3f4f6",
70
+ "200": "#e5e7eb",
71
+ "300": "#d1d5db",
72
+ "400": "#9ca3af",
73
+ "500": "#6b7280",
74
+ "600": "#4b5563",
75
+ "700": "#374151",
76
+ "800": "#1f2937",
77
+ "900": "#111827",
78
+ "950": "#00060c"
79
+ },
80
+ "green": {
81
+ "50": "#f0fdf4",
82
+ "100": "#dcfce7",
83
+ "200": "#bbf7d0",
84
+ "300": "#86efac",
85
+ "400": "#4ade80",
86
+ "500": "#22c55e",
87
+ "600": "#16a34a",
88
+ "700": "#15803d",
89
+ "800": "#166534",
90
+ "900": "#14532d",
91
+ "950": "#052e16"
92
+ },
93
+ "indigo": {
94
+ "50": "#eef2ff",
95
+ "100": "#e0e7ff",
96
+ "200": "#c7d2fe",
97
+ "300": "#a5b4fc",
98
+ "400": "#818cf8",
99
+ "500": "#6366f1",
100
+ "600": "#4f46e5",
101
+ "700": "#4338ca",
102
+ "800": "#3730a3",
103
+ "900": "#312e81",
104
+ "950": "#1e1b4b"
105
+ },
106
+ "lime": {
107
+ "50": "#f7fee7",
108
+ "100": "#ecfccb",
109
+ "200": "#d9f99d",
110
+ "300": "#bef264",
111
+ "400": "#a3e635",
112
+ "500": "#84cc16",
113
+ "600": "#65a30d",
114
+ "700": "#4d7c0f",
115
+ "800": "#3f6212",
116
+ "900": "#365314",
117
+ "950": "#1a2e05"
118
+ },
119
+ "orange": {
120
+ "50": "#fff7ed",
121
+ "100": "#ffedd5",
122
+ "200": "#fed7aa",
123
+ "300": "#fdba74",
124
+ "400": "#fb923c",
125
+ "500": "#f97316",
126
+ "600": "#ea580c",
127
+ "700": "#c2410c",
128
+ "800": "#9a3412",
129
+ "900": "#7c2d12",
130
+ "950": "#431407"
131
+ },
132
+ "pink": {
133
+ "50": "#fdf2f8",
134
+ "100": "#fce7f3",
135
+ "200": "#fbcfe8",
136
+ "300": "#f9a8d4",
137
+ "400": "#f472b6",
138
+ "500": "#ec4899",
139
+ "600": "#db2777",
140
+ "700": "#be185d",
141
+ "800": "#9d174d",
142
+ "900": "#831843",
143
+ "950": "#500724"
144
+ },
145
+ "purple": {
146
+ "50": "#faf5ff",
147
+ "100": "#f3e8ff",
148
+ "200": "#e9d5ff",
149
+ "300": "#d8b4fe",
150
+ "400": "#c084fc",
151
+ "500": "#a855f7",
152
+ "600": "#9333ea",
153
+ "700": "#7e22ce",
154
+ "800": "#6b21a8",
155
+ "900": "#581c87",
156
+ "950": "#3b0764"
157
+ },
158
+ "red": {
159
+ "50": "#fef2f2",
160
+ "100": "#fee2e2",
161
+ "200": "#fecaca",
162
+ "300": "#fca5a5",
163
+ "400": "#f87171",
164
+ "500": "#ef4444",
165
+ "600": "#dc2626",
166
+ "700": "#b91c1c",
167
+ "800": "#991b1b",
168
+ "900": "#7f1d1d",
169
+ "950": "#450a0a"
170
+ },
171
+ "rose": {
172
+ "50": "#fff1f2",
173
+ "100": "#ffe4e6",
174
+ "200": "#fecdd3",
175
+ "300": "#fda4af",
176
+ "400": "#fb7185",
177
+ "500": "#f43f5e",
178
+ "600": "#e11d48",
179
+ "700": "#be123c",
180
+ "800": "#9f1239",
181
+ "900": "#881337",
182
+ "950": "#4c0519"
183
+ },
184
+ "sky": {
185
+ "50": "#f0f9ff",
186
+ "100": "#e0f2fe",
187
+ "200": "#bae6fd",
188
+ "300": "#7dd3fc",
189
+ "400": "#38bdf8",
190
+ "500": "#0ea5e9",
191
+ "600": "#0284c7",
192
+ "700": "#0369a1",
193
+ "800": "#075985",
194
+ "900": "#0c4a6e",
195
+ "950": "#082f49"
196
+ },
197
+ "slate": {
198
+ "50": "#f8fafc",
199
+ "100": "#f1f5f9",
200
+ "200": "#e2e8f0",
201
+ "300": "#cbd5e0",
202
+ "400": "#94a3b8",
203
+ "500": "#64748b",
204
+ "600": "#475569",
205
+ "700": "#334155",
206
+ "800": "#1e293b",
207
+ "900": "#0f172a",
208
+ "950": "#020617"
209
+ },
210
+ "stone": {
211
+ "50": "#fafaf9",
212
+ "100": "#f5f5f4",
213
+ "200": "#e7e5e4",
214
+ "300": "#d6d3d1",
215
+ "400": "#a8a29e",
216
+ "500": "#78716c",
217
+ "600": "#57534e",
218
+ "700": "#44403c",
219
+ "800": "#292524",
220
+ "900": "#1c1917",
221
+ "950": "#0c0a09"
222
+ },
223
+ "teal": {
224
+ "50": "#f0fdfa",
225
+ "100": "#ccfbf1",
226
+ "200": "#99f6e4",
227
+ "300": "#5eead4",
228
+ "400": "#2dd4bf",
229
+ "500": "#14b8a6",
230
+ "600": "#0d9488",
231
+ "700": "#0f766e",
232
+ "800": "#115e59",
233
+ "900": "#134e4a",
234
+ "950": "#042f2e"
235
+ },
236
+ "violet": {
237
+ "50": "#f5f3ff",
238
+ "100": "#ede9fe",
239
+ "200": "#ddd6fe",
240
+ "300": "#c4b5fd",
241
+ "400": "#a78bfa",
242
+ "500": "#8b5cf6",
243
+ "600": "#7c3aed",
244
+ "700": "#6d28d9",
245
+ "800": "#5b21b6",
246
+ "900": "#4c1d95",
247
+ "950": "#2e1065"
248
+ },
249
+ "yellow": {
250
+ "50": "#fefce8",
251
+ "100": "#fef9c3",
252
+ "200": "#fef08a",
253
+ "300": "#fde047",
254
+ "400": "#facc15",
255
+ "500": "#eab308",
256
+ "600": "#ca8a04",
257
+ "700": "#a16207",
258
+ "800": "#854d0e",
259
+ "900": "#713f12",
260
+ "950": "#422006"
261
+ },
262
+ "zinc": {
263
+ "50": "#fafafa",
264
+ "100": "#f4f4f5",
265
+ "200": "#e4e4e7",
266
+ "300": "#d4d4d8",
267
+ "400": "#a1a1aa",
268
+ "500": "#71717a",
269
+ "600": "#52525b",
270
+ "700": "#3f3f46",
271
+ "800": "#27272a",
272
+ "900": "#18181b",
273
+ "950": "#000000"
274
+ }
275
+ }
@@ -0,0 +1,34 @@
1
+ const LINE_TYPES = {
2
+ CHILD: 'child',
3
+ LAST: 'last',
4
+ SIBLING: 'sibling',
5
+ EMPTY: 'empty',
6
+ ICON: 'icon'
7
+ }
8
+
9
+ const nextType = {
10
+ [LINE_TYPES.CHILD]: LINE_TYPES.SIBLING,
11
+ [LINE_TYPES.LAST]: LINE_TYPES.EMPTY,
12
+ [LINE_TYPES.SIBLING]: LINE_TYPES.SIBLING,
13
+ [LINE_TYPES.EMPTY]: LINE_TYPES.EMPTY
14
+ }
15
+
16
+ /**
17
+ * Constructs an array of line types for tree visualization
18
+ * @param {boolean} hasChildren - Whether the node has children
19
+ * @param {import('./types').LineType[]} parentTypes - Types from parent nodes
20
+ * @param {import('./types').LineType} position - Current position type
21
+ * @returns {import('./types').LineType[]} Array of line types
22
+ */
23
+ export function getLineTypes(hasChildren = false, parentTypes = [], position = LINE_TYPES.CHILD) {
24
+ return parentTypes
25
+ .reduce((acc, type, index) => {
26
+ // For all but the last parent type, convert to next type
27
+ if (index < parentTypes.length - 1) {
28
+ return [...acc, nextType[type]]
29
+ }
30
+ // For the last parent type, use the position
31
+ return [...acc, position]
32
+ }, [])
33
+ .concat(hasChildren ? LINE_TYPES.ICON : LINE_TYPES.EMPTY)
34
+ }
package/src/constants.js CHANGED
@@ -1,102 +1,165 @@
1
- export const defaultIcons = [
1
+ export { defaultColors, syntaxColors, shades, defaultPalette } from './colors/index'
2
+ export const DATA_IMAGE_REGEX = /^data:image\/(jpeg|png|gif|bmp|webp|svg\+xml)/i
3
+
4
+ // ─── Snippet names ────────────────────────────────────────────────────────────
5
+
6
+ export const ITEM_SNIPPET = 'itemContent'
7
+ export const GROUP_SNIPPET = 'groupContent'
8
+ /**
9
+ * @deprecated Use BASE_FIELDS from @rokkit/core instead.
10
+ * Retained for legacy ListController/FieldMapper/Proxy consumers (Toolbar, Table).
11
+ * Will be removed when those components migrate to Wrapper+Navigator.
12
+ * @type {import('./types).FieldMapping} Fields
13
+ */
14
+ export const DEFAULT_FIELDS = {
15
+ id: 'id',
16
+ href: 'href',
17
+ icon: 'icon',
18
+ text: 'text',
19
+ value: 'value',
20
+ keywords: 'keywords',
21
+ children: 'children',
22
+ iconPrefix: null,
23
+ image: 'image',
24
+ summary: 'summary',
25
+ notes: 'notes',
26
+ props: 'props',
27
+ target: 'target',
28
+ state: 'state',
29
+ level: 'level',
30
+ parent: 'parent',
31
+ currency: 'currency',
32
+ label: 'label',
33
+ component: 'component', // to be deprecated in favour of snippet
34
+ snippet: 'snippet',
35
+ disabled: 'disabled',
36
+ /* flag fields */
37
+ deleted: '_deleted',
38
+ expanded: '_expanded',
39
+ selected: '_selected'
40
+ }
41
+
42
+ // ─── BASE_FIELDS ─────────────────────────────────────────────────────────────
43
+ // Canonical field mapping for ProxyItem and all Wrapper+Navigator components.
44
+ // Semantic keys map to common raw data keys for backward compatibility.
45
+
46
+ export const BASE_FIELDS = {
47
+ // Identity
48
+ id: 'id',
49
+ value: 'value',
50
+ // Display
51
+ label: 'label',
52
+ icon: 'icon',
53
+ avatar: 'image',
54
+ subtext: 'description',
55
+ tooltip: 'title',
56
+ badge: 'badge',
57
+ shortcut: 'shortcut',
58
+ // Structure
59
+ children: 'children',
60
+ type: 'type',
61
+ snippet: 'snippet',
62
+ href: 'href',
63
+ hrefTarget: 'target',
64
+ // State
65
+ disabled: 'disabled',
66
+ expanded: 'expanded',
67
+ selected: 'selected',
68
+ }
69
+
70
+ const LEGACY_KEY_MAP = { description: 'subtext', title: 'tooltip', image: 'avatar', target: 'hrefTarget' }
71
+
72
+ /**
73
+ * Remap legacy field-override keys to their BASE_FIELDS semantic equivalents.
74
+ * e.g. { text: 'name' } → { label: 'name' }
75
+ *
76
+ * @param {Record<string, string> | null | undefined} fields
77
+ * @returns {Record<string, string>}
78
+ */
79
+ export function normalizeFields(fields) {
80
+ if (!fields || typeof fields !== 'object') return {}
81
+ const result = {}
82
+ for (const [key, value] of Object.entries(fields)) {
83
+ result[LEGACY_KEY_MAP[key] ?? key] = value
84
+ }
85
+ return result
86
+ }
87
+
88
+ export const DEFAULT_ICONS = [
2
89
  'accordion-opened',
3
90
  'accordion-closed',
4
91
  'action-remove',
92
+ 'action-cancel',
93
+ 'action-retry',
5
94
  'action-add',
6
95
  'action-clear',
7
96
  'action-search',
8
97
  'action-close',
9
- 'action-close-filled',
98
+ 'action-copy',
99
+ 'action-copysuccess',
100
+ 'action-check',
101
+ 'action-pin',
102
+ 'action-save',
103
+ 'action-unpin',
10
104
  'node-opened',
11
105
  'node-closed',
106
+ 'folder-opened',
107
+ 'folder-closed',
12
108
  'selector-opened',
13
109
  'selector-closed',
110
+ 'menu-opened',
111
+ 'menu-closed',
14
112
  'checkbox-checked',
15
113
  'checkbox-unchecked',
16
114
  'checkbox-unknown',
17
115
  'rating-filled',
18
116
  'rating-empty',
117
+ 'rating-half',
19
118
  'radio-off',
20
119
  'radio-on',
21
120
  'mode-dark',
22
121
  'mode-light',
122
+ 'mode-system',
23
123
  'navigate-left',
24
124
  'navigate-right',
25
125
  'navigate-up',
26
- 'navigate-down'
126
+ 'navigate-down',
127
+ 'palette-hex',
128
+ 'palette-presets',
129
+ 'state-error',
130
+ 'state-warning',
131
+ 'state-success',
132
+ 'state-info',
133
+ 'state-unknown',
134
+ 'badge-fail',
135
+ 'badge-warn',
136
+ 'badge-pass',
137
+ 'badge-unknown',
138
+ 'sort-none',
139
+ 'sort-ascending',
140
+ 'sort-descending',
141
+ 'validity-failed',
142
+ 'validity-passed',
143
+ 'validity-unknown',
144
+ 'validity-warning',
145
+ 'alert-clear',
146
+ 'alert-unread',
147
+ 'align-horizontal-left',
148
+ 'align-horizontal-right',
149
+ 'align-horizontal-center',
150
+ 'align-vertical-top',
151
+ 'align-vertical-bottom',
152
+ 'align-vertical-middle'
27
153
  ]
28
154
 
29
- // export const defaultIcons = [
30
- // 'accordion-opened',
31
- // 'accordion-closed',
32
- // 'action-remove',
33
- // 'action-add',
34
- // 'action-clear',
35
- // 'action-search',
36
- // 'action-close',
37
- // 'node-opened',
38
- // 'node-closed',
39
- // 'checkbox-checked',
40
- // 'checkbox-unchecked',
41
- // 'checkbox-unknown',
42
- // 'rating-filled',
43
- // 'rating-empty',
44
- // 'rating-half',
45
- // 'radio-off',
46
- // 'radio-on',
47
- // 'folder-closed',
48
- // 'folder-opened',
49
- // 'navigate-up',
50
- // 'navigate-down',
51
- // 'navigate-left',
52
- // 'navigate-right',
53
- // 'selector-closed',
54
- // 'selector-opened',
55
- // 'mode-dark',
56
- // 'mode-light'
57
- // ]
58
-
59
- export const defaultOptions = {
155
+ export const DEFAULT_OPTIONS = {
60
156
  id: 'id',
61
157
  label: 'label',
62
158
  value: 'value',
63
159
  checked: 'checked'
64
160
  }
65
161
 
66
- /**
67
- * Structure to map custom fields for rendering
68
- *
69
- * @typedef FieldMapping
70
- * @property {string} [id='id'] - Unique id for the item
71
- * @property {string} [text='text'] - Attribute to identify the text to render
72
- * @property {string} [url='url'] - Attribute to identify a URL
73
- * @property {string} [icon='icon'] - Attribute to identify an icon class to render
74
- * @property {string} [image='image'] - Attribute to identify an image to render
75
- * @property {string} [children='children'] - Attribute to identify children of the current item
76
- * @property {string} [summary='summary']
77
- * @property {string} [notes='notes']
78
- * @property {string} [props='props']
79
- * @property {string} [isOpen='_open'] - Attribute to identify if the current item is open
80
- * @property {string} [isDeleted='_deleted'] - Attribute to identify if the current item is deleted
81
- * @property {FieldMapping} [fields] - Field mapping to be used on children in the next level
82
- */
83
- export const defaultFields = {
84
- id: 'id',
85
- url: 'url',
86
- text: 'text',
87
- children: 'data',
88
- icon: 'icon',
89
- image: 'image',
90
- component: 'component',
91
- summary: 'summary',
92
- notes: 'notes',
93
- props: 'props',
94
- target: 'target',
95
- isOpen: '_open',
96
- isDeleted: '_deleted'
97
- }
98
-
99
- export const defaultKeyMap = {
162
+ export const DEFAULT_KEYMAP = {
100
163
  ArrowRight: 'open',
101
164
  ArrowLeft: 'close',
102
165
  ArrowDown: 'down',
@@ -105,45 +168,56 @@ export const defaultKeyMap = {
105
168
  Escape: 'deselect'
106
169
  }
107
170
 
171
+ export const DEFAULT_THEME_MAPPING = {
172
+ surface: 'slate',
173
+ primary: 'orange',
174
+ secondary: 'pink',
175
+ accent: 'sky',
176
+ success: 'green',
177
+ warning: 'yellow',
178
+ danger: 'red',
179
+ error: 'red',
180
+ info: 'cyan'
181
+ }
182
+
183
+ export const TONE_MAP = {
184
+ z0: 50,
185
+ z1: 100,
186
+ z2: 200,
187
+ z3: 300,
188
+ z4: 400,
189
+ z5: 500,
190
+ z6: 600,
191
+ z7: 700,
192
+ z8: 800,
193
+ z9: 900,
194
+ z10: 950
195
+ }
196
+ /**
197
+ * Splits an icon name into its group and key components.
198
+ * @param {string} name - The icon name to split.
199
+ * @returns {{ group: string, key: string, value: string }} An object containing the group, key, and value of the icon name.
200
+ */
201
+ function splitIconName(name) {
202
+ const parts = name.split('-')
203
+ const group = parts.slice(0, parts.length - 1).join('-')
204
+ return { group, key: parts[parts.length - 1], value: name }
205
+ }
206
+
207
+ /**
208
+ * Generate a state icon mapping from a list of icon names
209
+ *
210
+ * @param {string[]} icons
211
+ * @returns {import('./types').StateIcons}
212
+ */
108
213
  export function stateIconsFromNames(icons) {
109
- return icons
110
- .map((k) => [...k.split('-')])
111
- .reduce(
112
- (acc, parts) => ({
113
- ...acc,
114
- [parts[0]]: { ...acc[parts[0]], [parts[1]]: parts.join('-') }
115
- }),
116
- {}
117
- )
214
+ return icons.map(splitIconName).reduce(
215
+ (acc, { group, key, value }) => ({
216
+ ...acc,
217
+ [group]: { ...acc[group], [key]: value }
218
+ }),
219
+ {}
220
+ )
118
221
  }
119
222
 
120
- export const defaultStateIcons = stateIconsFromNames(defaultIcons)
121
- // export const defaultStateIcons = {
122
- // accordion: {
123
- // opened: 'accordion-opened',
124
- // closed: 'accordion-closed'
125
- // },
126
- // item: {
127
- // remove: 'item-remove',
128
- // add: 'item-add',
129
- // clear: 'item-clear',
130
- // search: 'item-search'
131
- // },
132
- // node: {
133
- // opened: 'node-opened',
134
- // closed: 'node-closed'
135
- // },
136
- // list: {
137
- // selector: 'list-selector'
138
- // },
139
- // checkbox: {
140
- // checked: 'checkbox-checked',
141
- // unchecked: 'checkbox-unchecked',
142
- // unknown: 'checkbox-unknown'
143
- // },
144
- // rating: { filled: 'rating-filled', empty: 'rating-empty' },
145
- // radio: {
146
- // off: 'radio-off',
147
- // on: 'radio-on'
148
- // }
149
- // }
223
+ export const DEFAULT_STATE_ICONS = stateIconsFromNames(DEFAULT_ICONS)
package/src/events.js ADDED
@@ -0,0 +1,32 @@
1
+ import { noop } from './utils.js'
2
+
3
+ /**
4
+ * Creates an emitter object from the given properties.
5
+ *
6
+ * - Filters attributes that start with 'on' and are functions,
7
+ * - Returns an object with keys that are the event names (without the 'on' prefix)
8
+ * - If a default event is not present in the props, it will be set to a no-op function.
9
+ *
10
+ * @param {Object} props - The properties object to filter.
11
+ * @param {Array<string>} defaults - An array of default events.
12
+ * @returns {import('./types.js').EventHandlers} The emitter object.
13
+ */
14
+ export function createEmitter(props, defaults = []) {
15
+ const emit = {}
16
+
17
+ // Filter and add functions that start with 'on'
18
+ Object.entries(props)
19
+ .filter(([key, value]) => key.startsWith('on') && typeof value === 'function')
20
+ .forEach(([key, value]) => {
21
+ emit[key.slice(2)] = value
22
+ })
23
+
24
+ // Add default events with no-op function if not present
25
+ defaults.forEach((event) => {
26
+ if (!emit[event]) {
27
+ emit[event] = noop
28
+ }
29
+ })
30
+
31
+ return emit
32
+ }