@svgrid/grid 2.2.30 → 2.2.32

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 (145) hide show
  1. package/README.md +1 -1
  2. package/dist/SvAvatar.svelte +1 -1
  3. package/dist/SvCheckBox.svelte +2 -1
  4. package/dist/SvCircularProgress.svelte +1 -1
  5. package/dist/SvGrid.controller.svelte.d.ts +20 -0
  6. package/dist/SvGrid.controller.svelte.js +358 -18
  7. package/dist/SvGrid.css +103 -3
  8. package/dist/SvGrid.svelte +162 -10
  9. package/dist/SvGrid.types.d.ts +81 -0
  10. package/dist/SvGridDropdown.svelte +38 -6
  11. package/dist/SvGridDropdown.svelte.d.ts +4 -0
  12. package/dist/SvGridSelect.svelte +12 -3
  13. package/dist/SvGridSelect.svelte.d.ts +6 -0
  14. package/dist/SvGroupCell.svelte +9 -2
  15. package/dist/SvMultiSelect.svelte +12 -3
  16. package/dist/SvMultiSelect.svelte.d.ts +6 -0
  17. package/dist/SvPasswordInput.svelte +1 -1
  18. package/dist/SvProgress.svelte +1 -1
  19. package/dist/SvRating.svelte +1 -1
  20. package/dist/SvResult.svelte +1 -1
  21. package/dist/SvRichText.svelte +31 -16
  22. package/dist/SvRichText.svelte.d.ts +9 -0
  23. package/dist/SvSwitchButton.svelte +2 -1
  24. package/dist/SvToaster.svelte +1 -1
  25. package/dist/SvTree.svelte +9 -2
  26. package/dist/SvTree.svelte.d.ts +5 -0
  27. package/dist/SvTreeSelect.svelte +6 -2
  28. package/dist/build-api.js +16 -0
  29. package/dist/cdn/{GridMenus-Ds3OpzZT.js → GridMenus-C6ixSGWW.js} +33 -33
  30. package/dist/cdn/{GridMenus-Da_p7SKS.js → GridMenus-Cyk3qpJ7.js} +33 -33
  31. package/dist/cdn/{SvDateTimePicker-B8GopjhC.js → SvDateTimePicker-CdqaP61H.js} +2 -1
  32. package/dist/cdn/{SvDateTimePicker-DB0aIEk8.js → SvDateTimePicker-ClqtVIj3.js} +2 -1
  33. package/dist/cdn/{SvGridDropdown-DjALc_4f.js → SvGridDropdown-D0VdjeR8.js} +129 -123
  34. package/dist/cdn/{SvGridDropdown-hpnHvOGt.js → SvGridDropdown-Dh-2ej8j.js} +92 -87
  35. package/dist/cdn/{src-BLJfdyL0.js → src-BgHjWF0Q.js} +4193 -3837
  36. package/dist/cdn/{src-DYDCiC0D.js → src-CgD-wiuS.js} +5956 -5602
  37. package/dist/cdn/svgrid.js +8 -8
  38. package/dist/cdn/svgrid.svelte-external.js +8 -8
  39. package/dist/cell-render.d.ts +1 -0
  40. package/dist/cell-render.js +115 -1
  41. package/dist/cell-values.js +5 -0
  42. package/dist/core.d.ts +80 -9
  43. package/dist/core.js +89 -0
  44. package/dist/editor-contract.d.ts +12 -5
  45. package/dist/editor-registry.d.ts +18 -7
  46. package/dist/editor-registry.js +10 -1
  47. package/dist/group-display.d.ts +39 -0
  48. package/dist/group-display.js +52 -0
  49. package/dist/index.d.ts +2 -2
  50. package/dist/index.js +2 -2
  51. package/dist/keyboard-handlers.js +16 -0
  52. package/dist/recurrence.js +3 -2
  53. package/dist/svgrid-wrapper.types.d.ts +8 -2
  54. package/dist/themes/index.d.ts +10 -0
  55. package/dist/themes/index.js +26 -0
  56. package/package.json +1 -1
  57. package/src/SvAccordion.test.ts +5 -5
  58. package/src/SvAvatar.svelte +1 -1
  59. package/src/SvButtonGroup.test.ts +6 -6
  60. package/src/SvCheckBox.svelte +2 -1
  61. package/src/SvCircularProgress.svelte +1 -1
  62. package/src/SvFileUpload.test.ts +1 -1
  63. package/src/SvGrid.controller.svelte.ts +367 -17
  64. package/src/SvGrid.css +103 -3
  65. package/src/SvGrid.svelte +162 -10
  66. package/src/SvGrid.types.ts +81 -0
  67. package/src/SvGridDropdown.svelte +38 -6
  68. package/src/SvGridSelect.svelte +12 -3
  69. package/src/SvGroupCell.svelte +9 -2
  70. package/src/SvMultiSelect.svelte +12 -3
  71. package/src/SvPasswordInput.svelte +1 -1
  72. package/src/SvProgress.svelte +1 -1
  73. package/src/SvRating.svelte +1 -1
  74. package/src/SvResult.svelte +1 -1
  75. package/src/SvRichText.svelte +31 -16
  76. package/src/SvSwitchButton.svelte +2 -1
  77. package/src/SvToaster.svelte +1 -1
  78. package/src/SvTree.svelte +9 -2
  79. package/src/SvTreeSelect.svelte +6 -2
  80. package/src/build-api.ts +15 -0
  81. package/src/builtin-editors.test.ts +3 -1
  82. package/src/cell-render.test.ts +27 -3
  83. package/src/cell-render.ts +122 -1
  84. package/src/cell-values.ts +4 -0
  85. package/src/chart-export.test.ts +2 -2
  86. package/src/clipboard.test.ts +0 -2
  87. package/src/core.ts +157 -8
  88. package/src/editing.test.ts +1 -1
  89. package/src/editor-contract.ts +12 -5
  90. package/src/editor-registry.grid.test.ts +48 -0
  91. package/src/editor-registry.test.ts +3 -1
  92. package/src/editor-registry.ts +23 -7
  93. package/src/facet-buckets.test.ts +33 -33
  94. package/src/group-display.test.ts +91 -1
  95. package/src/group-display.ts +83 -0
  96. package/src/index.ts +9 -0
  97. package/src/keyboard-handlers.ts +17 -0
  98. package/src/list-power.test.ts +2 -2
  99. package/src/menus.test.ts +4 -4
  100. package/src/named-views.coverage.test.ts +3 -3
  101. package/src/recurrence.ts +3 -2
  102. package/src/row-resize.test.ts +40 -40
  103. package/src/scheduler-model.ts +1 -1
  104. package/src/server-data-source.coverage.test.ts +1 -1
  105. package/src/server-group-model.test.ts +6 -6
  106. package/src/spreadsheet.test.ts +0 -1
  107. package/src/svgrid-wrapper.types.ts +11 -9
  108. package/src/svgrid.async-editor-options.test.ts +271 -0
  109. package/src/svgrid.auto-row-height.test.ts +204 -0
  110. package/src/svgrid.charting.test.ts +4 -4
  111. package/src/svgrid.comments-autocomplete.test.ts +8 -2
  112. package/src/svgrid.context-menu.test.ts +25 -9
  113. package/src/svgrid.filter-depth.test.ts +163 -0
  114. package/src/svgrid.filter-menu-listbox.svelte.test.ts +16 -2
  115. package/src/svgrid.filter-menu-scroll.test.ts +10 -2
  116. package/src/svgrid.grand-total.test.ts +188 -0
  117. package/src/svgrid.group-display-mode.test.ts +171 -0
  118. package/src/svgrid.group-footers.test.ts +121 -0
  119. package/src/svgrid.group-pagination.test.ts +153 -0
  120. package/src/svgrid.tree-data.test.ts +186 -0
  121. package/src/svgriddropdown.async-panel.svelte.test.ts +195 -0
  122. package/src/themes/index.ts +42 -0
  123. package/src/tree-edit.test.ts +4 -4
  124. package/src/tree-row-model.test.ts +169 -0
  125. package/src/ui-localization.test.ts +113 -0
  126. package/themes/ag-alpine.css +22 -0
  127. package/themes/antd.css +22 -0
  128. package/themes/atlassian.css +22 -0
  129. package/themes/bootstrap.css +22 -0
  130. package/themes/carbon.css +22 -0
  131. package/themes/catppuccin.css +22 -0
  132. package/themes/dracula.css +22 -0
  133. package/themes/ember.css +22 -0
  134. package/themes/excel.css +22 -0
  135. package/themes/fluent.css +22 -0
  136. package/themes/github.css +22 -0
  137. package/themes/linear.css +22 -0
  138. package/themes/material.css +22 -0
  139. package/themes/nord.css +22 -0
  140. package/themes/notion.css +22 -0
  141. package/themes/salesforce.css +22 -0
  142. package/themes/sap.css +22 -0
  143. package/themes/shadcn.css +22 -0
  144. package/themes/tailwind.css +22 -0
  145. package/themes/vercel.css +22 -0
@@ -0,0 +1,169 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { createTreeRowModel, flattenTreeData } from './core'
3
+
4
+ type Node = { id: number; parent: number | null; name: string }
5
+
6
+ /** Minimal Row stand-ins - the model only reads `original`, `id` and spreads. */
7
+ function rowsFrom(data: Node[]) {
8
+ return data.map((original, index) => ({
9
+ id: String(original.id),
10
+ index,
11
+ original,
12
+ depth: 0,
13
+ getCanExpand: () => false,
14
+ getIsExpanded: () => false,
15
+ toggleExpanded: () => {},
16
+ getIsSelected: () => false,
17
+ toggleSelected: () => {},
18
+ getAllCells: () => [],
19
+ getCellValueByColumnId: (c: string) => (original as never as Record<string, unknown>)[c],
20
+ })) as never[]
21
+ }
22
+
23
+ let expandedState: Record<string, boolean> = {}
24
+ const table = {
25
+ getState: () => ({ expanded: expandedState }),
26
+ setExpanded: (fn: (p: Record<string, boolean>) => Record<string, boolean>) => {
27
+ expandedState = fn(expandedState)
28
+ },
29
+ } as never
30
+
31
+ const run = (data: Node[], opts = { parentField: 'parent' }) =>
32
+ createTreeRowModel<never>(opts)({ table, rows: rowsFrom(data) } as never)
33
+
34
+ const ids = (rows: readonly { id: string }[]) => rows.map((r) => r.id)
35
+
36
+ describe('createTreeRowModel', () => {
37
+ const data: Node[] = [
38
+ { id: 1, parent: null, name: 'root' },
39
+ { id: 2, parent: 1, name: 'child a' },
40
+ { id: 3, parent: 1, name: 'child b' },
41
+ { id: 4, parent: 2, name: 'grandchild' },
42
+ { id: 5, parent: null, name: 'other root' },
43
+ ]
44
+
45
+ it('nests by parent id and returns only roots', () => {
46
+ const out = run(data)
47
+ expect(ids(out)).toEqual(['1', '5'])
48
+ })
49
+
50
+ it('records depth down the chain', () => {
51
+ const [root] = run(data) as never as Array<{ depth: number; subRows: never[] }>
52
+ expect(root!.depth).toBe(0)
53
+ const child = (root!.subRows as never as Array<{ id: string; depth: number; subRows: never[] }>)[0]!
54
+ expect(child.depth).toBe(1)
55
+ expect((child.subRows as never as Array<{ depth: number }>)[0]!.depth).toBe(2)
56
+ })
57
+
58
+ it('marks rows with children expandable and leaves not', () => {
59
+ const [root, other] = run(data) as never as Array<{ getCanExpand: () => boolean }>
60
+ expect(root!.getCanExpand()).toBe(true)
61
+ expect(other!.getCanExpand()).toBe(false)
62
+ })
63
+
64
+ it('counts descendants, not just direct children', () => {
65
+ const [root] = run(data) as never as Array<{ leafCount: number }>
66
+ // children a + b, plus a's grandchild
67
+ expect(root!.leafCount).toBe(3)
68
+ })
69
+
70
+ it('tags rows so they are not mistaken for group banners', async () => {
71
+ const { isGroupRow } = await import('./cell-values')
72
+ const [root] = run(data) as never as Array<never>
73
+ expect((root as never as { __treeRow: boolean }).__treeRow).toBe(true)
74
+ // Expandable, but must NOT render as a full-width banner.
75
+ expect(isGroupRow(root!)).toBe(false)
76
+ })
77
+
78
+ it('drives expansion through the table state', () => {
79
+ expandedState = {}
80
+ const [root] = run(data) as never as Array<{
81
+ getIsExpanded: () => boolean
82
+ toggleExpanded: () => void
83
+ }>
84
+ expect(root!.getIsExpanded()).toBe(false)
85
+ root!.toggleExpanded()
86
+ expect(expandedState['1']).toBe(true)
87
+ })
88
+
89
+ it('promotes a row whose parent is missing rather than dropping it', () => {
90
+ // Parent 99 does not exist - e.g. the filter removed it. The row must still
91
+ // be reachable.
92
+ const orphaned: Node[] = [
93
+ { id: 1, parent: null, name: 'root' },
94
+ { id: 2, parent: 99, name: 'orphan' },
95
+ ]
96
+ expect(ids(run(orphaned))).toEqual(['1', '2'])
97
+ })
98
+
99
+ it('survives a parent cycle', () => {
100
+ const cyclic: Node[] = [
101
+ { id: 1, parent: 2, name: 'a' },
102
+ { id: 2, parent: 1, name: 'b' },
103
+ ]
104
+ // Neither is a root by parent link, so nothing is emitted rather than
105
+ // recursing forever. The guard is what matters.
106
+ expect(() => run(cyclic)).not.toThrow()
107
+ })
108
+
109
+ it('treats a self-parenting row as a root', () => {
110
+ expect(ids(run([{ id: 1, parent: 1, name: 'self' }]))).toEqual(['1'])
111
+ })
112
+
113
+ it('passes an empty set straight through', () => {
114
+ expect(run([])).toEqual([])
115
+ })
116
+
117
+ it('honours a custom idField', () => {
118
+ type K = { key: number; parent: number | null }
119
+ const keyed = [
120
+ { key: 10, parent: null },
121
+ { key: 11, parent: 10 },
122
+ ] as never as Node[]
123
+ const out = createTreeRowModel<never>({ parentField: 'parent', idField: 'key' })({
124
+ table,
125
+ rows: rowsFrom(keyed),
126
+ } as never) as never as Array<{ subRows: never[] }>
127
+ expect(out).toHaveLength(1)
128
+ expect(out[0]!.subRows).toHaveLength(1)
129
+ })
130
+ })
131
+
132
+ describe('flattenTreeData', () => {
133
+ const nested = [
134
+ { id: 1, name: 'a', kids: [{ id: 2, name: 'a1', kids: [{ id: 3, name: 'a1a' }] }] },
135
+ { id: 4, name: 'b' },
136
+ ]
137
+
138
+ it('emits children directly after their parent', () => {
139
+ const flat = flattenTreeData(nested as never, { childrenField: 'kids' })
140
+ expect(flat.map((r) => (r as never as { id: number }).id)).toEqual([1, 2, 3, 4])
141
+ })
142
+
143
+ it('stamps the parent link the tree model reads', () => {
144
+ const flat = flattenTreeData(nested as never, { childrenField: 'kids' }) as never as Array<
145
+ Record<string, unknown>
146
+ >
147
+ expect(flat[0]!.__parentId).toBeNull()
148
+ expect(flat[1]!.__parentId).toBe(1)
149
+ expect(flat[2]!.__parentId).toBe(2)
150
+ })
151
+
152
+ it('round-trips into createTreeRowModel', () => {
153
+ const flat = flattenTreeData(nested as never, { childrenField: 'kids' })
154
+ const out = createTreeRowModel<never>({ parentField: '__parentId' })({
155
+ table,
156
+ rows: rowsFrom(flat as never as Node[]),
157
+ } as never) as never as Array<{ id: string; subRows: never[] }>
158
+ expect(out.map((r) => r.id)).toEqual(['1', '4'])
159
+ expect(out[0]!.subRows).toHaveLength(1)
160
+ })
161
+
162
+ it('accepts a custom parent field name', () => {
163
+ const flat = flattenTreeData(nested as never, {
164
+ childrenField: 'kids',
165
+ parentField: 'pid',
166
+ }) as never as Array<Record<string, unknown>>
167
+ expect(flat[1]!.pid).toBe(1)
168
+ })
169
+ })
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Every user-facing string in the kit must be overridable.
3
+ *
4
+ * These components shipped chrome copy - toolbar tooltips, "No matches", the
5
+ * lazy-load placeholder, search-box labels - baked in as literals, so an app in
6
+ * any other language had English fragments it could not reach. Each is now a
7
+ * prop; these tests pin that down so the strings cannot quietly go back to
8
+ * being hard-coded.
9
+ */
10
+ import { describe, expect, it, afterEach } from 'vitest'
11
+ import { mount, unmount, flushSync } from 'svelte'
12
+ import SvRichText from './SvRichText.svelte'
13
+ import SvMultiSelect from './SvMultiSelect.svelte'
14
+ import SvGridSelect from './SvGridSelect.svelte'
15
+ import SvTree from './SvTree.svelte'
16
+
17
+ function mnt(Comp: unknown, props: Record<string, unknown>) {
18
+ const target = document.createElement('div')
19
+ document.body.appendChild(target)
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const app = mount(Comp as any, { target, props: props as any })
22
+ flushSync()
23
+ return { target, destroy: () => { unmount(app); target.remove() } }
24
+ }
25
+
26
+ let cleanup: (() => void) | null = null
27
+ afterEach(() => {
28
+ cleanup?.()
29
+ cleanup = null
30
+ document.querySelectorAll('.sv-ms__panel, .sv-gs__panel').forEach((n) => n.remove())
31
+ })
32
+
33
+ describe('SvRichText localization', () => {
34
+ it('defaults to English toolbar labels', () => {
35
+ const g = mnt(SvRichText, {})
36
+ cleanup = g.destroy
37
+ const bold = g.target.querySelector('[data-tool="bold"]')!
38
+ expect(bold.getAttribute('title')).toBe('Bold')
39
+ expect(bold.getAttribute('aria-label')).toBe('Bold')
40
+ expect(g.target.querySelector('[role="toolbar"]')!.getAttribute('aria-label')).toBe('Formatting')
41
+ })
42
+
43
+ it('takes per-tool overrides through `messages`', () => {
44
+ const g = mnt(SvRichText, { messages: { bold: 'Fett', italic: 'Kursiv', toolbar: 'Formatierung' } })
45
+ cleanup = g.destroy
46
+ const bold = g.target.querySelector('[data-tool="bold"]')!
47
+ expect(bold.getAttribute('title')).toBe('Fett')
48
+ expect(bold.getAttribute('aria-label')).toBe('Fett')
49
+ expect(g.target.querySelector('[data-tool="italic"]')!.getAttribute('title')).toBe('Kursiv')
50
+ expect(g.target.querySelector('[role="toolbar"]')!.getAttribute('aria-label')).toBe('Formatierung')
51
+ // An un-overridden key keeps its default rather than going blank.
52
+ expect(g.target.querySelector('[data-tool="underline"]')!.getAttribute('title')).toBe('Underline')
53
+ })
54
+
55
+ it('keeps the glyphs fixed - they are not language-dependent', () => {
56
+ const g = mnt(SvRichText, { messages: { bold: 'Fett' } })
57
+ cleanup = g.destroy
58
+ expect(g.target.querySelector('[data-tool="bold"]')!.textContent?.trim()).toBe('B')
59
+ })
60
+ })
61
+
62
+ describe('empty / search text is overridable', () => {
63
+ it('SvMultiSelect emptyText + search chrome', () => {
64
+ const g = mnt(SvMultiSelect, {
65
+ options: [],
66
+ emptyText: 'Keine Treffer',
67
+ searchPlaceholder: 'Suchen…',
68
+ searchLabel: 'Optionen suchen',
69
+ })
70
+ cleanup = g.destroy
71
+ g.target.querySelector<HTMLButtonElement>('.sv-ms__trigger')?.click()
72
+ flushSync()
73
+ const panel = document.querySelector('.sv-ms__panel')
74
+ expect(panel?.textContent).toContain('Keine Treffer')
75
+ const search = panel?.querySelector('input')
76
+ expect(search?.getAttribute('placeholder')).toBe('Suchen…')
77
+ expect(search?.getAttribute('aria-label')).toBe('Optionen suchen')
78
+ })
79
+
80
+ it('SvGridSelect emptyText + search chrome', () => {
81
+ const g = mnt(SvGridSelect, {
82
+ columns: [{ field: 'name', header: 'Name' }],
83
+ options: [],
84
+ emptyText: 'Sin resultados',
85
+ searchPlaceholder: 'Buscar…',
86
+ searchLabel: 'Buscar opciones',
87
+ })
88
+ cleanup = g.destroy
89
+ g.target.querySelector<HTMLButtonElement>('.sv-gs__trigger')?.click()
90
+ flushSync()
91
+ const panel = document.querySelector('.sv-gs__panel')
92
+ expect(panel?.textContent).toContain('Sin resultados')
93
+ const search = panel?.querySelector('input')
94
+ expect(search?.getAttribute('placeholder')).toBe('Buscar…')
95
+ expect(search?.getAttribute('aria-label')).toBe('Buscar opciones')
96
+ })
97
+
98
+ it('SvTree lazy-load placeholder', async () => {
99
+ let resolveKids: (v: Array<{ id: string; label: string }>) => void = () => {}
100
+ const g = mnt(SvTree, {
101
+ nodes: [{ id: 'root', label: 'Root', lazy: true }],
102
+ loadChildren: () => new Promise<Array<{ id: string; label: string }>>((r) => { resolveKids = r }),
103
+ loadingText: 'Chargement…',
104
+ })
105
+ cleanup = g.destroy
106
+ g.target.querySelector<HTMLElement>('.sv-tree__twist')?.click()
107
+ flushSync()
108
+ await Promise.resolve()
109
+ flushSync()
110
+ expect(g.target.textContent).toContain('Chargement…')
111
+ resolveKids([{ id: 'kid', label: 'Child' }])
112
+ })
113
+ })
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 3px;
18
18
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #2196f3;
24
+ --sg-muted-bg: rgba(33, 150, 243, 0.1);
25
+ --sg-skeleton-bg: rgba(33, 150, 243, 0.1);
26
+ --sg-radius-lg: 6px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #babfc7;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #f8f8f8;
20
31
  --sg-scrollbar-border: #babfc7;
21
32
  --sg-scrollbar-thumb: rgba(24, 29, 31, 0.5);
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 3px;
47
58
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #2196f3;
64
+ --sg-muted-bg: rgba(33, 150, 243, 0.1);
65
+ --sg-skeleton-bg: rgba(33, 150, 243, 0.1);
66
+ --sg-radius-lg: 6px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #68686e;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #222628;
49
71
  --sg-scrollbar-border: #68686e;
50
72
  --sg-scrollbar-thumb: rgba(255, 255, 255, 0.5);
package/themes/antd.css CHANGED
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 6px;
18
18
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #1677ff;
24
+ --sg-muted-bg: #f5f5f5;
25
+ --sg-skeleton-bg: #f5f5f5;
26
+ --sg-radius-lg: 12px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #d9d9d9;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #fafafa;
20
31
  --sg-scrollbar-border: #d9d9d9;
21
32
  --sg-scrollbar-thumb: rgba(0, 0, 0, 0.65);
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 6px;
47
58
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #177ddc;
64
+ --sg-muted-bg: #262626;
65
+ --sg-skeleton-bg: #262626;
66
+ --sg-radius-lg: 12px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #424242;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #1f1f1f;
49
71
  --sg-scrollbar-border: #424242;
50
72
  --sg-scrollbar-thumb: rgba(255, 255, 255, 0.65);
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 3px;
18
18
  --sg-font: "Charlie Display", "Atlassian Sans", -apple-system, "Segoe UI", sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #0c66e4;
24
+ --sg-muted-bg: #f1f2f4;
25
+ --sg-skeleton-bg: #f1f2f4;
26
+ --sg-radius-lg: 6px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #dcdfe4;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #fafbfc;
20
31
  --sg-scrollbar-border: #dcdfe4;
21
32
  --sg-scrollbar-thumb: #44546f;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 3px;
47
58
  --sg-font: "Charlie Display", "Atlassian Sans", -apple-system, "Segoe UI", sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #579dff;
64
+ --sg-muted-bg: #2c333a;
65
+ --sg-skeleton-bg: #2c333a;
66
+ --sg-radius-lg: 6px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #38414a;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #22272b;
49
71
  --sg-scrollbar-border: #38414a;
50
72
  --sg-scrollbar-thumb: #8590a2;
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 6px;
18
18
  --sg-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #0d6efd;
24
+ --sg-muted-bg: #f2f2f2;
25
+ --sg-skeleton-bg: #f2f2f2;
26
+ --sg-radius-lg: 12px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #dee2e6;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #f8f9fa;
20
31
  --sg-scrollbar-border: #dee2e6;
21
32
  --sg-scrollbar-thumb: #6c757d;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 6px;
47
58
  --sg-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #0d6efd;
64
+ --sg-muted-bg: #2c3034;
65
+ --sg-skeleton-bg: #2c3034;
66
+ --sg-radius-lg: 12px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #495057;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #2b3035;
49
71
  --sg-scrollbar-border: #495057;
50
72
  --sg-scrollbar-thumb: #adb5bd;
package/themes/carbon.css CHANGED
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 0px;
18
18
  --sg-font: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #0f62fe;
24
+ --sg-muted-bg: #e8e8e8;
25
+ --sg-skeleton-bg: #e8e8e8;
26
+ --sg-radius-lg: 0px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #e0e0e0;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #e0e0e0;
20
31
  --sg-scrollbar-border: #e0e0e0;
21
32
  --sg-scrollbar-thumb: #525252;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #18181b;
46
57
  --sg-radius: 0px;
47
58
  --sg-font: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #78a9ff;
64
+ --sg-muted-bg: #333333;
65
+ --sg-skeleton-bg: #333333;
66
+ --sg-radius-lg: 0px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #393939;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #393939;
49
71
  --sg-scrollbar-border: #393939;
50
72
  --sg-scrollbar-thumb: #c6c6c6;
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 8px;
18
18
  --sg-font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #8839ef;
24
+ --sg-muted-bg: #dce0e8;
25
+ --sg-skeleton-bg: #dce0e8;
26
+ --sg-radius-lg: 16px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #ccd0da;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #e6e9ef;
20
31
  --sg-scrollbar-border: #ccd0da;
21
32
  --sg-scrollbar-thumb: #6c6f85;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #18181b;
46
57
  --sg-radius: 8px;
47
58
  --sg-font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #cba6f7;
64
+ --sg-muted-bg: #313244;
65
+ --sg-skeleton-bg: #313244;
66
+ --sg-radius-lg: 16px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #313244;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #181825;
49
71
  --sg-scrollbar-border: #313244;
50
72
  --sg-scrollbar-thumb: #a6adc8;
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 6px;
18
18
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #644ac9;
24
+ --sg-muted-bg: #f2efe3;
25
+ --sg-skeleton-bg: #f2efe3;
26
+ --sg-radius-lg: 12px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #dedccf;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #ece9df;
20
31
  --sg-scrollbar-border: #dedccf;
21
32
  --sg-scrollbar-thumb: #6c664b;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #18181b;
46
57
  --sg-radius: 6px;
47
58
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #bd93f9;
64
+ --sg-muted-bg: #343746;
65
+ --sg-skeleton-bg: #343746;
66
+ --sg-radius-lg: 12px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #44475a;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #21222c;
49
71
  --sg-scrollbar-border: #44475a;
50
72
  --sg-scrollbar-thumb: #6272a4;
package/themes/ember.css CHANGED
@@ -22,6 +22,17 @@
22
22
  --sg-on-accent: #ffffff;
23
23
  --sg-radius: 6px;
24
24
  --sg-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
25
+ --sg-danger: #dc2626;
26
+ --sg-success: #16a34a;
27
+ --sg-warning: #d97706;
28
+ --sg-info: #0891b2;
29
+ --sg-focus-ring: #ff3e00;
30
+ --sg-muted-bg: #f5f5f4;
31
+ --sg-skeleton-bg: #f5f5f4;
32
+ --sg-radius-lg: 12px;
33
+ --sg-rating-on: #d97706;
34
+ --sg-rating-empty: #e7e5e4;
35
+ --sg-invalid-fg: #dc2626;
25
36
  --sg-scrollbar-bg: #fafaf9;
26
37
  --sg-scrollbar-border: #e7e5e4;
27
38
  --sg-scrollbar-thumb: #78716c;
@@ -57,6 +68,17 @@
57
68
  --sg-on-accent: #ffffff;
58
69
  --sg-radius: 6px;
59
70
  --sg-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
71
+ --sg-danger: #f87171;
72
+ --sg-success: #4ade80;
73
+ --sg-warning: #fbbf24;
74
+ --sg-info: #22d3ee;
75
+ --sg-focus-ring: #ff5a1f;
76
+ --sg-muted-bg: #1c1917;
77
+ --sg-skeleton-bg: #1c1917;
78
+ --sg-radius-lg: 12px;
79
+ --sg-rating-on: #fbbf24;
80
+ --sg-rating-empty: #292524;
81
+ --sg-invalid-fg: #f87171;
60
82
  --sg-scrollbar-bg: #1c1917;
61
83
  --sg-scrollbar-border: #292524;
62
84
  --sg-scrollbar-thumb: #a8a29e;
package/themes/excel.css CHANGED
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 0px;
18
18
  --sg-font: "Aptos", "Segoe UI", Calibri, Arial, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #107c41;
24
+ --sg-muted-bg: #edebe9;
25
+ --sg-skeleton-bg: #edebe9;
26
+ --sg-radius-lg: 0px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #d2d0ce;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #f3f2f1;
20
31
  --sg-scrollbar-border: #d2d0ce;
21
32
  --sg-scrollbar-thumb: #605e5c;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #18181b;
46
57
  --sg-radius: 0px;
47
58
  --sg-font: "Aptos", "Segoe UI", Calibri, Arial, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #58c188;
64
+ --sg-muted-bg: #323130;
65
+ --sg-skeleton-bg: #323130;
66
+ --sg-radius-lg: 0px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #3b3a39;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #252423;
49
71
  --sg-scrollbar-border: #3b3a39;
50
72
  --sg-scrollbar-thumb: #c8c6c4;
package/themes/fluent.css CHANGED
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 4px;
18
18
  --sg-font: "Segoe UI Variable", "Segoe UI", system-ui, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #0f6cbd;
24
+ --sg-muted-bg: #f0f0f0;
25
+ --sg-skeleton-bg: #f0f0f0;
26
+ --sg-radius-lg: 8px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #e0e0e0;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #f5f5f5;
20
31
  --sg-scrollbar-border: #e0e0e0;
21
32
  --sg-scrollbar-thumb: #616161;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 4px;
47
58
  --sg-font: "Segoe UI Variable", "Segoe UI", system-ui, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #479ef5;
64
+ --sg-muted-bg: #3d3d3d;
65
+ --sg-skeleton-bg: #3d3d3d;
66
+ --sg-radius-lg: 8px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #666666;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #141414;
49
71
  --sg-scrollbar-border: #666666;
50
72
  --sg-scrollbar-thumb: #d6d6d6;
package/themes/github.css CHANGED
@@ -16,6 +16,17 @@
16
16
  --sg-on-accent: #ffffff;
17
17
  --sg-radius: 6px;
18
18
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
19
+ --sg-danger: #dc2626;
20
+ --sg-success: #16a34a;
21
+ --sg-warning: #d97706;
22
+ --sg-info: #0891b2;
23
+ --sg-focus-ring: #0969da;
24
+ --sg-muted-bg: #f6f8fa;
25
+ --sg-skeleton-bg: #f6f8fa;
26
+ --sg-radius-lg: 12px;
27
+ --sg-rating-on: #d97706;
28
+ --sg-rating-empty: #d1d9e0;
29
+ --sg-invalid-fg: #dc2626;
19
30
  --sg-scrollbar-bg: #f6f8fa;
20
31
  --sg-scrollbar-border: #d1d9e0;
21
32
  --sg-scrollbar-thumb: #59636e;
@@ -45,6 +56,17 @@
45
56
  --sg-on-accent: #ffffff;
46
57
  --sg-radius: 6px;
47
58
  --sg-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
59
+ --sg-danger: #f87171;
60
+ --sg-success: #4ade80;
61
+ --sg-warning: #fbbf24;
62
+ --sg-info: #22d3ee;
63
+ --sg-focus-ring: #4493f8;
64
+ --sg-muted-bg: #151b23;
65
+ --sg-skeleton-bg: #151b23;
66
+ --sg-radius-lg: 12px;
67
+ --sg-rating-on: #fbbf24;
68
+ --sg-rating-empty: #3d444d;
69
+ --sg-invalid-fg: #f87171;
48
70
  --sg-scrollbar-bg: #151b23;
49
71
  --sg-scrollbar-border: #3d444d;
50
72
  --sg-scrollbar-thumb: #9198a1;