@rokkit/core 1.0.0-next.16 → 1.0.0-next.160

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 (75) hide show
  1. package/README.md +121 -1
  2. package/package.json +31 -39
  3. package/src/calendar.js +44 -0
  4. package/src/colors/extra.json +16 -0
  5. package/src/colors/index.ts +24 -0
  6. package/src/colors/syntax.json +42 -0
  7. package/src/colors/tailwind.json +275 -0
  8. package/src/connector.js +34 -0
  9. package/src/constants.js +165 -107
  10. package/src/events.js +32 -0
  11. package/src/field-mapper.js +147 -0
  12. package/src/index.js +19 -27
  13. package/src/key-event-map.js +35 -0
  14. package/src/mapped-items.js +22 -0
  15. package/src/mapping.js +21 -0
  16. package/src/nested.js +28 -0
  17. package/src/string.js +97 -0
  18. package/src/theme.ts +208 -0
  19. package/src/ticks.js +26 -0
  20. package/src/types.js +160 -0
  21. package/src/utils.js +272 -0
  22. package/src/vite/icon-collections.js +73 -0
  23. package/src/vite/index.js +1 -0
  24. package/LICENSE +0 -21
  25. package/src/Accordion.svelte +0 -80
  26. package/src/Alerts.svelte +0 -39
  27. package/src/DropDown.svelte +0 -82
  28. package/src/DropSearch.svelte +0 -67
  29. package/src/EditableTabs.svelte +0 -31
  30. package/src/Icon.svelte +0 -15
  31. package/src/List-Discard.svelte +0 -48
  32. package/src/List.svelte +0 -65
  33. package/src/ListActions.svelte +0 -35
  34. package/src/NavTabs.svelte +0 -0
  35. package/src/NestedList.svelte +0 -77
  36. package/src/Overlay.svelte +0 -4
  37. package/src/PageNavigator.svelte +0 -94
  38. package/src/ResponsiveGrid.svelte +0 -73
  39. package/src/Scrollable.svelte +0 -8
  40. package/src/Searchable.svelte +0 -19
  41. package/src/Sidebar.svelte +0 -5
  42. package/src/Slider.svelte +0 -17
  43. package/src/SpinList.svelte +0 -48
  44. package/src/SplitPane.svelte +0 -109
  45. package/src/SplitView.svelte +0 -44
  46. package/src/Splitter.svelte +0 -95
  47. package/src/TabItem.svelte +0 -27
  48. package/src/TabItems.svelte +0 -34
  49. package/src/Tabs.svelte +0 -49
  50. package/src/Tree.svelte +0 -45
  51. package/src/actions/dismissable.js +0 -24
  52. package/src/actions/fillable.js +0 -114
  53. package/src/actions/hierarchy.js +0 -180
  54. package/src/actions/index.js +0 -7
  55. package/src/actions/navigable.js +0 -43
  56. package/src/actions/navigator.js +0 -179
  57. package/src/actions/pannable.js +0 -50
  58. package/src/actions/swipeable.js +0 -56
  59. package/src/actions/themeable.js +0 -23
  60. package/src/items/Collapsible.svelte +0 -51
  61. package/src/items/Connector.svelte +0 -26
  62. package/src/items/Link.svelte +0 -18
  63. package/src/items/Node.svelte +0 -52
  64. package/src/items/Pill.svelte +0 -33
  65. package/src/items/Separator.svelte +0 -1
  66. package/src/items/Summary.svelte +0 -27
  67. package/src/items/Text.svelte +0 -21
  68. package/src/items/index.js +0 -8
  69. package/src/list.js +0 -14
  70. package/src/mocks/Custom.svelte +0 -7
  71. package/src/mocks/index.js +0 -10
  72. package/src/stores/alerts.js +0 -3
  73. package/src/stores/index.js +0 -6
  74. package/src/stores/persist.js +0 -63
  75. package/src/stores/theme.js +0 -34
package/README.md CHANGED
@@ -1 +1,121 @@
1
- # Core Components
1
+ # @rokkit/core
2
+
3
+ Core utilities for the Rokkit design system — field mapping, constants, calendar, color palette, and event utilities.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm install @rokkit/core
9
+ # or
10
+ bun add @rokkit/core
11
+ ```
12
+
13
+ ## Overview
14
+
15
+ `@rokkit/core` is the foundation layer shared across all Rokkit packages. It provides:
16
+
17
+ - **Field mapping** — map arbitrary data object shapes to semantic field names
18
+ - **Constants** — `BASE_FIELDS`, `DEFAULT_STATE_ICONS`, `DEFAULT_KEYMAP`, and more
19
+ - **Color palette** — default colors, shades, and theme color mapping
20
+ - **Calendar utilities** — calendar day generation and weekday labels
21
+ - **Event utilities** — lightweight emitter factory
22
+ - **Direction detection** — RTL/LTR helpers
23
+ - **Tick generation** — axis tick utilities for chart packages
24
+
25
+ No runtime dependencies on other `@rokkit/*` packages.
26
+
27
+ ## Usage
28
+
29
+ ### Field mapping
30
+
31
+ `FieldMapper` maps semantic field names (`label`, `value`, `icon`, etc.) to the actual keys present in your data objects. Pass a fields override to adapt any data shape.
32
+
33
+ ```js
34
+ import { FieldMapper } from '@rokkit/core'
35
+
36
+ const mapper = new FieldMapper({ label: 'name', value: 'id', icon: 'iconClass' })
37
+
38
+ const item = { id: 42, name: 'Settings', iconClass: 'i-settings' }
39
+
40
+ mapper.get('label', item) // 'Settings'
41
+ mapper.get('value', item) // 42
42
+ mapper.get('icon', item) // 'i-settings'
43
+ ```
44
+
45
+ ### normalizeFields
46
+
47
+ Merge user-supplied field overrides with `BASE_FIELDS` defaults, remapping any legacy key names automatically.
48
+
49
+ ```js
50
+ import { normalizeFields, BASE_FIELDS } from '@rokkit/core'
51
+
52
+ const fields = normalizeFields({ label: 'title', value: 'slug' })
53
+ // { label: 'title', value: 'slug', icon: 'icon', children: 'children', ... }
54
+ ```
55
+
56
+ ### BASE_FIELDS reference
57
+
58
+ ```js
59
+ import { BASE_FIELDS } from '@rokkit/core'
60
+
61
+ // {
62
+ // id: 'id', value: 'value', label: 'label',
63
+ // icon: 'icon', avatar: 'image', subtext: 'description',
64
+ // tooltip: 'title', badge: 'badge', shortcut: 'shortcut',
65
+ // children: 'children', type: 'type', snippet: 'snippet',
66
+ // href: 'href', hrefTarget: 'target',
67
+ // disabled: 'disabled', expanded: 'expanded', selected: 'selected'
68
+ // }
69
+ ```
70
+
71
+ ### Event emitter
72
+
73
+ ```js
74
+ import { createEmitter } from '@rokkit/core'
75
+
76
+ const emitter = createEmitter()
77
+ emitter.on('select', (item) => console.log('selected', item))
78
+ emitter.emit('select', myItem)
79
+ ```
80
+
81
+ ### Calendar utilities
82
+
83
+ ```js
84
+ import { getCalendarDays, weekdays } from '@rokkit/core'
85
+
86
+ const days = getCalendarDays(2025, 2) // February 2025
87
+ // weekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
88
+ ```
89
+
90
+ ### Tick generation
91
+
92
+ ```js
93
+ import { generateTicks } from '@rokkit/core'
94
+
95
+ const ticks = generateTicks(0, 100, 5)
96
+ // [0, 25, 50, 75, 100]
97
+ ```
98
+
99
+ ## API
100
+
101
+ | Export | Description |
102
+ | -------------------------------- | ------------------------------------------------------------- |
103
+ | `BASE_FIELDS` | Canonical semantic-to-data-key field mapping |
104
+ | `normalizeFields(fields)` | Merge overrides with BASE_FIELDS defaults |
105
+ | `FieldMapper` | Class that resolves semantic field reads from data objects |
106
+ | `DEFAULT_STATE_ICONS` | Icon name map grouped by category (action, state, sort, etc.) |
107
+ | `DEFAULT_KEYMAP` | Default keyboard navigation key mapping |
108
+ | `DEFAULT_THEME_MAPPING` | Default semantic color → palette color mapping |
109
+ | `createEmitter()` | Lightweight event emitter factory |
110
+ | `getCalendarDays(year, month)` | Calendar day array for a given month |
111
+ | `weekdays` | Localized weekday label array |
112
+ | `generateTicks(min, max, count)` | Evenly spaced axis tick values |
113
+ | `defaultColors` | Default color palette array |
114
+ | `shades` | Available shade scale values |
115
+ | `ITEM_SNIPPET` | Constant: default item snippet key (`'itemContent'`) |
116
+ | `GROUP_SNIPPET` | Constant: default group snippet key (`'groupContent'`) |
117
+ | `stateIconsFromNames(names)` | Build a state icon map from an array of icon name strings |
118
+
119
+ ---
120
+
121
+ Part of [Rokkit](https://github.com/jerrythomas/rokkit) — a Svelte 5 component library and design system.
package/package.json CHANGED
@@ -1,59 +1,51 @@
1
1
  {
2
2
  "name": "@rokkit/core",
3
- "version": "1.0.0-next.16",
4
- "description": "Core components, actions and stores for svelte apps.",
3
+ "version": "1.0.0-next.160",
4
+ "description": "Contains core utility functions and classes that can be used in various components.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/jerrythomas/rokkit.git"
8
+ },
5
9
  "author": "Jerry Thomas <me@jerrythomas.name>",
6
10
  "license": "MIT",
7
- "main": "index.js",
8
- "svelte": "src/index.js",
9
- "module": "src/index.js",
10
- "types": "dist/index.d.ts",
11
11
  "type": "module",
12
- "prettier": "@jerrythomas/prettier-config",
13
12
  "publishConfig": {
14
13
  "access": "public"
15
14
  },
16
- "devDependencies": {
17
- "@jerrythomas/eslint-config-svelte": "^1.0.2",
18
- "@jerrythomas/prettier-config": "^1.0.0",
19
- "@sveltejs/vite-plugin-svelte": "^2.0.2",
20
- "@testing-library/svelte": "^3.2.2",
21
- "@vitest/coverage-istanbul": "^0.28.5",
22
- "@vitest/ui": "~0.12.10",
23
- "eslint": "^7.32.0",
24
- "jsdom": "^19.0.0",
25
- "svelte": "^3.55.1",
26
- "typescript": "^4.9.5",
27
- "validators": "latest",
28
- "vite": "^4.1.1",
29
- "vitest": "~0.19.1",
30
- "shared-config": "1.0.0"
15
+ "scripts": {
16
+ "prepublishOnly": "cp ../../LICENSE . && bunx tsc --project tsconfig.build.json",
17
+ "postpublish": "rm -f LICENSE",
18
+ "clean": "rm -rf dist",
19
+ "build": "bun clean && bun prepublishOnly"
31
20
  },
32
21
  "files": [
33
22
  "src/**/*.js",
34
- "src/**/*.svelte",
35
- "!src/mocks",
36
- "!src/**/*.spec.js"
23
+ "src/**/*.ts",
24
+ "src/**/*.json",
25
+ "dist/**/*.d.ts",
26
+ "README.md",
27
+ "package.json",
28
+ "LICENSE"
37
29
  ],
38
30
  "exports": {
39
31
  "./src": "./src",
40
32
  "./package.json": "./package.json",
41
- "./stores": "./src/stores/index.js",
42
- "./actions": "./src/actions/index.js",
43
- "./constants": "./src/constants.js",
44
33
  ".": {
45
34
  "types": "./dist/index.d.ts",
46
- "import": "./src/index.js"
35
+ "import": "./src/index.js",
36
+ "svelte": "./src/index.js"
37
+ },
38
+ "./vite": {
39
+ "types": "./dist/vite/index.d.ts",
40
+ "import": "./src/vite/index.js"
47
41
  }
48
42
  },
49
- "scripts": {
50
- "lint": "prettier --check --plugin-search-dir=. . && eslint .",
51
- "format": "prettier --write --plugin-search-dir=. .",
52
- "test:ct": "playwright test -c playwright.config.js",
53
- "test:ci": "vitest run",
54
- "test:ui": "vitest --ui",
55
- "test": "vitest",
56
- "coverage": "vitest run --coverage",
57
- "upgrade": "pnpm upgrade"
43
+ "dependencies": {
44
+ "@unocss/preset-mini": "^66.6.1",
45
+ "date-fns": "^4.1.0",
46
+ "ramda": "^0.32.0"
47
+ },
48
+ "devDependencies": {
49
+ "@rokkit/icons": "1.0.0-next.160"
58
50
  }
59
- }
51
+ }
@@ -0,0 +1,44 @@
1
+ import { getDay, getMonth, getYear, getDaysInMonth, format, isWeekend } from 'date-fns'
2
+
3
+ export const weekdays = [
4
+ 'Sunday',
5
+ 'Monday',
6
+ 'Tuesday',
7
+ 'Wednesday',
8
+ 'Thursday',
9
+ 'Friday',
10
+ 'Saturday'
11
+ ]
12
+
13
+ /**
14
+ * Get the days in the month.
15
+ *
16
+ * @param {Date} value
17
+ * @param {Array} holidays
18
+ * @param {boolean} fixed
19
+ * @returns {import('./types').CalendarDay[]}
20
+ */
21
+ export function getCalendarDays(value, holidays = [], fixed = false) {
22
+ const month = getMonth(value)
23
+ const year = getYear(value)
24
+ const offset = getDay(new Date(year, month, 1)) + 1
25
+
26
+ holidays = holidays.map((x) => format(new Date(x), 'yyyy-MMM-dd'))
27
+ let days = Array.from({ length: getDaysInMonth(value) }, (_, i) => ({
28
+ day: i + 1,
29
+ offset: i === 0 ? offset : 0,
30
+ date: new Date(year, month, i + 1)
31
+ })).map((x) => ({
32
+ ...x,
33
+ text: format(x.date, 'yyyy-MMM-dd'),
34
+ weekend: isWeekend(x.date),
35
+ holiday: holidays.includes(format(x.date, 'yyyy-MMM-dd'))
36
+ }))
37
+
38
+ if (fixed && days[0].offset > 4) {
39
+ const n = 5 * 7 - days[0].offset
40
+ days = [...days.slice(n + 1), ...days.slice(0, n + 1)]
41
+ }
42
+
43
+ return days
44
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "shark": {
3
+ "DEFAULT": "#828C9F",
4
+ "50": "#ffffff",
5
+ "100": "#efefef",
6
+ "200": "#E0E0E0",
7
+ "300": "#C1C6D0",
8
+ "400": "#828C9F",
9
+ "500": "#677287",
10
+ "600": "#51596A",
11
+ "700": "#3B414D",
12
+ "800": "#2E323C",
13
+ "900": "#20242A",
14
+ "950": "#1A1C22"
15
+ }
16
+ }
@@ -0,0 +1,24 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
+ // @ts-nocheck
3
+ import { colors } from '@unocss/preset-mini/colors'
4
+ import type { PresetMiniColors } from '@unocss/preset-mini/colors'
5
+ import syntaxColorPalette from './syntax.json' with { type: 'json' }
6
+ import extraColors from './extra.json' with { type: 'json' }
7
+
8
+ export const shades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
9
+ export const defaultPalette = [
10
+ 'surface',
11
+ 'primary',
12
+ 'secondary',
13
+ 'accent',
14
+ 'success',
15
+ 'warning',
16
+ 'danger',
17
+ 'info'
18
+ ]
19
+
20
+ export const syntaxColors = syntaxColorPalette
21
+ export const defaultColors: PresetMiniColors & typeof extraColors = {
22
+ ...colors,
23
+ ...extraColors
24
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "one-dark": {
3
+ "dark": {
4
+ "--tab-size": "2",
5
+ "--code-fill": "var(--surface-100)",
6
+ "--code-normal": "#e06c75",
7
+ "--code-string": "#98c379",
8
+ "--code-number": "#d19a66",
9
+ "--code-atrule": "var(--code-string)",
10
+ "--code-keyword": "#c678dd",
11
+ "--code-comment": "#5c6370",
12
+ "--code-property": "#d19a66",
13
+ "--code-selector": "var(--code-keyword)",
14
+ "--code-operator": "#56b6c2",
15
+ "--code-function": "#61afef",
16
+ "--code-gutter-marker": "black",
17
+ "--code-gutter-z2": "#999",
18
+ "--code-cursor": "#24292e",
19
+ "--code-cursor-block": "rgba(20, 255, 20, 0.5)",
20
+ "--code-linenumbers": "rgba(27, 31, 35, 0.3)"
21
+ },
22
+ "light": {
23
+ "--tab-size": "2",
24
+ "--code-fill": "var(--surface-100)",
25
+ "--code-normal": "#333333",
26
+ "--code-string": "#9D8248",
27
+ "--code-number": "#71A15D",
28
+ "--code-atrule": "var(--code-string)",
29
+ "--code-keyword": "#3080B5",
30
+ "--code-comment": "#969896",
31
+ "--code-property": "#63a35c",
32
+ "--code-selector": "var(--code-keyword)",
33
+ "--code-operator": "#bf5625",
34
+ "--code-function": "#a71d5d",
35
+ "--code-gutter-marker": "black",
36
+ "--code-gutter-z2": "#999",
37
+ "--code-cursor": "#24292e",
38
+ "--code-cursor-block": "rgba(20, 255, 20, 0.5)",
39
+ "--code-linenumbers": "rgba(27, 31, 35, 0.3)"
40
+ }
41
+ }
42
+ }
@@ -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
+ }