@awesome-markdown/board-ui 0.0.0-stage → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +76 -2
  2. package/dist/board/Board.d.ts +24 -0
  3. package/dist/board/Board.d.ts.map +1 -0
  4. package/dist/board/Board.js +166 -0
  5. package/dist/board/Board.js.map +1 -0
  6. package/dist/board/Cell.d.ts +23 -0
  7. package/dist/board/Cell.d.ts.map +1 -0
  8. package/dist/board/Cell.js +145 -0
  9. package/dist/board/Cell.js.map +1 -0
  10. package/dist/board/ColumnHeader.d.ts +18 -0
  11. package/dist/board/ColumnHeader.d.ts.map +1 -0
  12. package/dist/board/ColumnHeader.js +31 -0
  13. package/dist/board/ColumnHeader.js.map +1 -0
  14. package/dist/board/HomelessItemCard.d.ts +15 -0
  15. package/dist/board/HomelessItemCard.d.ts.map +1 -0
  16. package/dist/board/HomelessItemCard.js +36 -0
  17. package/dist/board/HomelessItemCard.js.map +1 -0
  18. package/dist/board/HomelessPanel.d.ts +17 -0
  19. package/dist/board/HomelessPanel.d.ts.map +1 -0
  20. package/dist/board/HomelessPanel.js +26 -0
  21. package/dist/board/HomelessPanel.js.map +1 -0
  22. package/dist/board/ItemCard.d.ts +21 -0
  23. package/dist/board/ItemCard.d.ts.map +1 -0
  24. package/dist/board/ItemCard.js +104 -0
  25. package/dist/board/ItemCard.js.map +1 -0
  26. package/dist/board/SwimlaneRow.d.ts +23 -0
  27. package/dist/board/SwimlaneRow.d.ts.map +1 -0
  28. package/dist/board/SwimlaneRow.js +30 -0
  29. package/dist/board/SwimlaneRow.js.map +1 -0
  30. package/dist/board/dnd/boardDnd.d.ts +15 -0
  31. package/dist/board/dnd/boardDnd.d.ts.map +1 -0
  32. package/dist/board/dnd/boardDnd.js +69 -0
  33. package/dist/board/dnd/boardDnd.js.map +1 -0
  34. package/dist/board/dnd/dragTypes.d.ts +24 -0
  35. package/dist/board/dnd/dragTypes.d.ts.map +1 -0
  36. package/dist/board/dnd/dragTypes.js +22 -0
  37. package/dist/board/dnd/dragTypes.js.map +1 -0
  38. package/dist/board/dnd/mutateDragDrop.d.ts +37 -0
  39. package/dist/board/dnd/mutateDragDrop.d.ts.map +1 -0
  40. package/dist/board/dnd/mutateDragDrop.js +116 -0
  41. package/dist/board/dnd/mutateDragDrop.js.map +1 -0
  42. package/dist/board/dnd/onDragEnd.d.ts +24 -0
  43. package/dist/board/dnd/onDragEnd.d.ts.map +1 -0
  44. package/dist/board/dnd/onDragEnd.js +47 -0
  45. package/dist/board/dnd/onDragEnd.js.map +1 -0
  46. package/dist/board/layout/AxisBehavior.d.ts +35 -0
  47. package/dist/board/layout/AxisBehavior.d.ts.map +1 -0
  48. package/dist/board/layout/AxisBehavior.js +82 -0
  49. package/dist/board/layout/AxisBehavior.js.map +1 -0
  50. package/dist/board/layout/AxisDrawer.d.ts +17 -0
  51. package/dist/board/layout/AxisDrawer.d.ts.map +1 -0
  52. package/dist/board/layout/AxisDrawer.js +40 -0
  53. package/dist/board/layout/AxisDrawer.js.map +1 -0
  54. package/dist/board/layout/BoardDrawer.d.ts +11 -0
  55. package/dist/board/layout/BoardDrawer.d.ts.map +1 -0
  56. package/dist/board/layout/BoardDrawer.js +27 -0
  57. package/dist/board/layout/BoardDrawer.js.map +1 -0
  58. package/dist/board/layout/Drawer.d.ts +19 -0
  59. package/dist/board/layout/Drawer.d.ts.map +1 -0
  60. package/dist/board/layout/Drawer.js +18 -0
  61. package/dist/board/layout/Drawer.js.map +1 -0
  62. package/dist/board/layout/FilterEditor.d.ts +12 -0
  63. package/dist/board/layout/FilterEditor.d.ts.map +1 -0
  64. package/dist/board/layout/FilterEditor.js +11 -0
  65. package/dist/board/layout/FilterEditor.js.map +1 -0
  66. package/dist/board/layout/InlineControls.d.ts +22 -0
  67. package/dist/board/layout/InlineControls.d.ts.map +1 -0
  68. package/dist/board/layout/InlineControls.js +39 -0
  69. package/dist/board/layout/InlineControls.js.map +1 -0
  70. package/dist/board/layout/SortableAxis.d.ts +28 -0
  71. package/dist/board/layout/SortableAxis.d.ts.map +1 -0
  72. package/dist/board/layout/SortableAxis.js +39 -0
  73. package/dist/board/layout/SortableAxis.js.map +1 -0
  74. package/dist/board/layout/axis-defaults.d.ts +22 -0
  75. package/dist/board/layout/axis-defaults.d.ts.map +1 -0
  76. package/dist/board/layout/axis-defaults.js +37 -0
  77. package/dist/board/layout/axis-defaults.js.map +1 -0
  78. package/dist/board/layout/filter-draft.d.ts +21 -0
  79. package/dist/board/layout/filter-draft.d.ts.map +1 -0
  80. package/dist/board/layout/filter-draft.js +110 -0
  81. package/dist/board/layout/filter-draft.js.map +1 -0
  82. package/dist/board/layout/useBoardLayout.d.ts +27 -0
  83. package/dist/board/layout/useBoardLayout.d.ts.map +1 -0
  84. package/dist/board/layout/useBoardLayout.js +92 -0
  85. package/dist/board/layout/useBoardLayout.js.map +1 -0
  86. package/dist/breadcrumb.d.ts +22 -0
  87. package/dist/breadcrumb.d.ts.map +1 -0
  88. package/dist/breadcrumb.js +15 -0
  89. package/dist/breadcrumb.js.map +1 -0
  90. package/dist/components/BoardAssigneeField.d.ts +10 -0
  91. package/dist/components/BoardAssigneeField.d.ts.map +1 -0
  92. package/dist/components/BoardAssigneeField.js +37 -0
  93. package/dist/components/BoardAssigneeField.js.map +1 -0
  94. package/dist/components/ConflictBanner.d.ts +12 -0
  95. package/dist/components/ConflictBanner.d.ts.map +1 -0
  96. package/dist/components/ConflictBanner.js +47 -0
  97. package/dist/components/ConflictBanner.js.map +1 -0
  98. package/dist/components/ConflictDiff.d.ts +13 -0
  99. package/dist/components/ConflictDiff.d.ts.map +1 -0
  100. package/dist/components/ConflictDiff.js +97 -0
  101. package/dist/components/ConflictDiff.js.map +1 -0
  102. package/dist/components/ConflictPanel.d.ts +16 -0
  103. package/dist/components/ConflictPanel.d.ts.map +1 -0
  104. package/dist/components/ConflictPanel.js +53 -0
  105. package/dist/components/ConflictPanel.js.map +1 -0
  106. package/dist/components/DeleteItemConfirmDialog.d.ts +14 -0
  107. package/dist/components/DeleteItemConfirmDialog.d.ts.map +1 -0
  108. package/dist/components/DeleteItemConfirmDialog.js +46 -0
  109. package/dist/components/DeleteItemConfirmDialog.js.map +1 -0
  110. package/dist/components/ItemEditorActions.d.ts +15 -0
  111. package/dist/components/ItemEditorActions.d.ts.map +1 -0
  112. package/dist/components/ItemEditorActions.js +48 -0
  113. package/dist/components/ItemEditorActions.js.map +1 -0
  114. package/dist/index.d.ts +32 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +37 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/lib/derive-summary.d.ts +9 -0
  119. package/dist/lib/derive-summary.d.ts.map +1 -0
  120. package/dist/lib/derive-summary.js +27 -0
  121. package/dist/lib/derive-summary.js.map +1 -0
  122. package/dist/lib/item-board.d.ts +5 -0
  123. package/dist/lib/item-board.d.ts.map +1 -0
  124. package/dist/lib/item-board.js +14 -0
  125. package/dist/lib/item-board.js.map +1 -0
  126. package/dist/lib/property-display.d.ts +18 -0
  127. package/dist/lib/property-display.d.ts.map +1 -0
  128. package/dist/lib/property-display.js +81 -0
  129. package/dist/lib/property-display.js.map +1 -0
  130. package/dist/pages/BoardListPage.d.ts +9 -0
  131. package/dist/pages/BoardListPage.d.ts.map +1 -0
  132. package/dist/pages/BoardListPage.js +113 -0
  133. package/dist/pages/BoardListPage.js.map +1 -0
  134. package/dist/pages/BoardPage.d.ts +7 -0
  135. package/dist/pages/BoardPage.d.ts.map +1 -0
  136. package/dist/pages/BoardPage.js +37 -0
  137. package/dist/pages/BoardPage.js.map +1 -0
  138. package/dist/pages/ItemEditorPage.d.ts +3 -0
  139. package/dist/pages/ItemEditorPage.d.ts.map +1 -0
  140. package/dist/pages/ItemEditorPage.js +255 -0
  141. package/dist/pages/ItemEditorPage.js.map +1 -0
  142. package/dist/provider/ProviderContext.d.ts +17 -0
  143. package/dist/provider/ProviderContext.d.ts.map +1 -0
  144. package/dist/provider/ProviderContext.js +21 -0
  145. package/dist/provider/ProviderContext.js.map +1 -0
  146. package/dist/router/RouterAdapter.d.ts +43 -0
  147. package/dist/router/RouterAdapter.d.ts.map +1 -0
  148. package/dist/router/RouterAdapter.js +21 -0
  149. package/dist/router/RouterAdapter.js.map +1 -0
  150. package/dist/shell/SyncStatusDot.d.ts +8 -0
  151. package/dist/shell/SyncStatusDot.d.ts.map +1 -0
  152. package/dist/shell/SyncStatusDot.js +58 -0
  153. package/dist/shell/SyncStatusDot.js.map +1 -0
  154. package/dist/shell/ThemeToggle.d.ts +8 -0
  155. package/dist/shell/ThemeToggle.d.ts.map +1 -0
  156. package/dist/shell/ThemeToggle.js +21 -0
  157. package/dist/shell/ThemeToggle.js.map +1 -0
  158. package/dist/state/theme-store.d.ts +17 -0
  159. package/dist/state/theme-store.d.ts.map +1 -0
  160. package/dist/state/theme-store.js +58 -0
  161. package/dist/state/theme-store.js.map +1 -0
  162. package/dist/state/useBoardRender.d.ts +16 -0
  163. package/dist/state/useBoardRender.d.ts.map +1 -0
  164. package/dist/state/useBoardRender.js +53 -0
  165. package/dist/state/useBoardRender.js.map +1 -0
  166. package/dist/state/useProviderSubscribe.d.ts +22 -0
  167. package/dist/state/useProviderSubscribe.d.ts.map +1 -0
  168. package/dist/state/useProviderSubscribe.js +48 -0
  169. package/dist/state/useProviderSubscribe.js.map +1 -0
  170. package/dist/sync/conflict-api.d.ts +16 -0
  171. package/dist/sync/conflict-api.d.ts.map +1 -0
  172. package/dist/sync/conflict-api.js +35 -0
  173. package/dist/sync/conflict-api.js.map +1 -0
  174. package/dist/sync/conflict-store.d.ts +44 -0
  175. package/dist/sync/conflict-store.d.ts.map +1 -0
  176. package/dist/sync/conflict-store.js +159 -0
  177. package/dist/sync/conflict-store.js.map +1 -0
  178. package/fonts/InterTight-Medium.woff2 +0 -0
  179. package/fonts/InterTight-Regular.woff2 +0 -0
  180. package/fonts/JetBrainsMono-Medium.woff2 +0 -0
  181. package/fonts/JetBrainsMono-Regular.woff2 +0 -0
  182. package/fonts/LICENSE +14 -0
  183. package/package.json +58 -3
  184. package/styles.css +232 -0
package/fonts/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Font licenses
2
+ =============
3
+
4
+ JetBrains Mono
5
+ --------------
6
+ Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
7
+ Licensed under the SIL Open Font License, Version 1.1.
8
+ https://scripts.sil.org/OFL
9
+
10
+ Inter Tight
11
+ -----------
12
+ Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
13
+ Licensed under the SIL Open Font License, Version 1.1.
14
+ https://scripts.sil.org/OFL
package/package.json CHANGED
@@ -1,6 +1,61 @@
1
1
  {
2
2
  "name": "@awesome-markdown/board-ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.6.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/Pjore/awesome-markdown",
8
+ "directory": "packages/board-ui"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": [
15
+ "*.css"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./styles.css": "./styles.css"
24
+ },
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "files": [
28
+ "dist",
29
+ "styles.css",
30
+ "fonts"
31
+ ],
32
+ "peerDependencies": {
33
+ "react": "^19.0.0",
34
+ "react-dom": "^19.0.0"
35
+ },
36
+ "dependencies": {
37
+ "@dnd-kit/core": "^6.3.1",
38
+ "@dnd-kit/sortable": "^10.0.0",
39
+ "@dnd-kit/utilities": "^3.2.2",
40
+ "diff": "^7.0.0",
41
+ "@awesome-markdown/filter-engine": "1.6.0",
42
+ "@awesome-markdown/contracts": "1.6.0",
43
+ "@awesome-markdown/provider-http": "1.6.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/react": "^19.0.0",
47
+ "@types/react-dom": "^19.0.0",
48
+ "jsdom": "^26.0.0",
49
+ "react": "^19.0.0",
50
+ "react-dom": "^19.0.0",
51
+ "typescript": "^5.7.3",
52
+ "vitest": "^3.0.0",
53
+ "@awesome-markdown/provider-localstorage": "1.6.0"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc --build",
57
+ "dev": "tsc --build --watch --preserveWatchOutput",
58
+ "typecheck": "tsc --build",
59
+ "test": "vitest run"
60
+ }
6
61
  }
package/styles.css ADDED
@@ -0,0 +1,232 @@
1
+ /*
2
+ * @awesome-markdown/board-ui styles — design tokens (light/dark), self-hosted
3
+ * fonts, layout utilities and board-editing classes. Import once from the host:
4
+ * import "@awesome-markdown/board-ui/styles.css";
5
+ */
6
+
7
+ /* Self-hosted fonts (resolved relative to this file by the host bundler) */
8
+ @font-face {
9
+ font-family: 'JetBrains Mono';
10
+ src: url('./fonts/JetBrainsMono-Regular.woff2') format('woff2');
11
+ font-weight: 400;
12
+ font-style: normal;
13
+ font-display: swap;
14
+ }
15
+
16
+ @font-face {
17
+ font-family: 'JetBrains Mono';
18
+ src: url('./fonts/JetBrainsMono-Medium.woff2') format('woff2');
19
+ font-weight: 500;
20
+ font-style: normal;
21
+ font-display: swap;
22
+ }
23
+
24
+ @font-face {
25
+ font-family: 'Inter Tight';
26
+ src: url('./fonts/InterTight-Regular.woff2') format('woff2');
27
+ font-weight: 400;
28
+ font-style: normal;
29
+ font-display: swap;
30
+ }
31
+
32
+ @font-face {
33
+ font-family: 'Inter Tight';
34
+ src: url('./fonts/InterTight-Medium.woff2') format('woff2');
35
+ font-weight: 500;
36
+ font-style: normal;
37
+ font-display: swap;
38
+ }
39
+
40
+ :root {
41
+ --bg: #FAFAF7;
42
+ --surface: #FAFAF7;
43
+ --ink: #111111;
44
+ --ink-muted: #6B6760;
45
+ --border: #E6E4DD;
46
+ --accent: #FFE94A;
47
+ --on-accent: #111111;
48
+ --font-mono: 'JetBrains Mono', monospace;
49
+ --font-sans: 'Inter Tight', sans-serif;
50
+ }
51
+
52
+ [data-theme="dark"] {
53
+ --bg: #0E0E0E;
54
+ --surface: #0E0E0E;
55
+ --ink: #E8E8E8;
56
+ --ink-muted: #8A867E;
57
+ --border: #262626;
58
+ --accent: #F5E663;
59
+ --on-accent: #111111;
60
+ }
61
+
62
+ *, *::before, *::after { box-sizing: border-box; }
63
+ body {
64
+ background: var(--bg);
65
+ color: var(--ink);
66
+ font-family: var(--font-sans);
67
+ font-size: 14px;
68
+ }
69
+
70
+ @keyframes pulse {
71
+ 0%, 100% { opacity: 1; }
72
+ 50% { opacity: 0.4; }
73
+ }
74
+
75
+ /* Base resets */
76
+ button, input, select, textarea {
77
+ border-radius: 0;
78
+ }
79
+
80
+ :focus-visible {
81
+ outline: 2px solid var(--accent);
82
+ outline-offset: 2px;
83
+ }
84
+
85
+ /* Layout utilities */
86
+ .flex { display: flex; }
87
+ .flex-col { flex-direction: column; }
88
+ .flex-1 { flex: 1; }
89
+ .flex-shrink-0 { flex-shrink: 0; }
90
+ .shrink-0 { flex-shrink: 0; }
91
+ .items-center { align-items: center; }
92
+ .items-start { align-items: flex-start; }
93
+ .justify-between { justify-content: space-between; }
94
+ .justify-center { justify-content: center; }
95
+ .justify-end { justify-content: flex-end; }
96
+ .flex-wrap { flex-wrap: wrap; }
97
+ .gap-1 { gap: 0.25rem; }
98
+ .gap-2 { gap: 0.5rem; }
99
+ .gap-3 { gap: 0.75rem; }
100
+ .gap-4 { gap: 1rem; }
101
+ .h-full { height: 100%; }
102
+ .h-screen { height: 100vh; }
103
+ .w-full { width: 100%; }
104
+ .w-28 { width: 112px; }
105
+ .min-w-\[240px\] { min-width: 240px; }
106
+ .w-\[240px\] { width: 240px; }
107
+ .min-h-\[120px\] { min-height: 120px; }
108
+ .max-w-2xl { max-width: 42rem; }
109
+ .max-w-md { max-width: 28rem; }
110
+ .max-w-6xl { max-width: 72rem; }
111
+ .overflow-hidden { overflow: hidden; }
112
+ .overflow-auto { overflow: auto; }
113
+ .overflow-y-auto { overflow-y: auto; }
114
+ .overflow-x-auto { overflow-x: auto; }
115
+
116
+ /* Spacing utilities */
117
+ .p-2 { padding: 0.5rem; }
118
+ .p-3 { padding: 0.75rem; }
119
+ .p-4 { padding: 1rem; }
120
+ .p-6 { padding: 1.5rem; }
121
+ .p-8 { padding: 2rem; }
122
+ .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
123
+ .px-4 { padding-left: 1rem; padding-right: 1rem; }
124
+ .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }
125
+ .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
126
+ .py-1\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }
127
+ .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
128
+ .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }
129
+ .py-4 { padding-top: 1rem; padding-bottom: 1rem; }
130
+ .py-16 { padding-top: 4rem; padding-bottom: 4rem; }
131
+ .pb-3 { padding-bottom: 0.75rem; }
132
+ .pb-4 { padding-bottom: 1rem; }
133
+ .pt-1 { padding-top: 0.25rem; }
134
+ .mb-4 { margin-bottom: 1rem; }
135
+ .ml-4 { margin-left: 1rem; }
136
+ .mt-1 { margin-top: 0.25rem; }
137
+ .mt-4 { margin-top: 1rem; }
138
+ .mx-4 { margin-left: 1rem; margin-right: 1rem; }
139
+ .mx-auto { margin-left: auto; margin-right: auto; }
140
+
141
+ /* Typography utilities */
142
+ .text-center { text-align: center; }
143
+ .text-xs { font-size: 0.75rem; line-height: 1rem; }
144
+ .text-sm { font-size: 0.875rem; line-height: 1.25rem; }
145
+ .text-xl { font-size: 1.25rem; line-height: 1.75rem; }
146
+ .text-5xl { font-size: 3rem; line-height: 1; }
147
+ .font-medium { font-weight: 500; }
148
+ .font-semibold { font-weight: 600; }
149
+ .font-mono { font-family: var(--font-mono); }
150
+ .whitespace-pre { white-space: pre; }
151
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
152
+ .min-w-0 { min-width: 0; }
153
+
154
+ /* Display utilities */
155
+ .block { display: block; }
156
+ .grid { display: grid; }
157
+ .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
158
+ .last\:border-b-0:last-child { border-bottom: 0; }
159
+ .space-y-2 > * + * { margin-top: 0.5rem; }
160
+ .space-y-3 > * + * { margin-top: 0.75rem; }
161
+ .space-y-5 > * + * { margin-top: 1.25rem; }
162
+ .space-y-6 > * + * { margin-top: 1.5rem; }
163
+
164
+ /* Position utilities */
165
+ .sticky { position: sticky; }
166
+ .top-0 { top: 0; }
167
+ .z-10 { z-index: 10; }
168
+ .z-50 { z-index: 50; }
169
+ .relative { position: relative; }
170
+ .fixed { position: fixed; }
171
+ .inset-0 { top: 0; right: 0; bottom: 0; left: 0; }
172
+
173
+ /* Border utilities */
174
+ .border-t { border-top: 1px solid var(--border); }
175
+ .border-b { border-bottom: 1px solid var(--border); }
176
+ .border-r { border-right: 1px solid var(--border); }
177
+ .rounded { border-radius: 4px; }
178
+ .rounded-lg { border-radius: 8px; }
179
+ .rounded-xl { border-radius: 12px; }
180
+
181
+ /* Interaction utilities */
182
+ .cursor-pointer { cursor: pointer; }
183
+ .cursor-not-allowed { cursor: not-allowed; }
184
+ .select-none { user-select: none; }
185
+ .pointer-events-none { pointer-events: none; }
186
+ .hover\:underline:hover { text-decoration: underline; }
187
+
188
+ /* Opacity utilities */
189
+ .opacity-50 { opacity: 0.5; }
190
+ .disabled\:opacity-50:disabled { opacity: 0.5; }
191
+
192
+ /* Shadow utilities */
193
+ .shadow-sm { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }
194
+ .shadow-xl { box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); }
195
+
196
+ /* Board layout editing */
197
+ .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; padding: 0; flex-shrink: 0; border: 1px solid transparent; background: none; color: var(--ink-muted); cursor: pointer; }
198
+ .icon-btn:hover { color: var(--ink); border-color: var(--border); }
199
+ .icon-btn[aria-pressed="true"] { background: var(--accent); color: var(--on-accent); }
200
+ .plus-btn { font: 16px var(--font-mono); border: 1px dashed var(--ink-muted); background: transparent; color: var(--ink-muted); cursor: pointer; padding: 0; }
201
+ .plus-btn:hover { border-style: solid; border-color: var(--ink); color: var(--ink); }
202
+ .axis-drag { cursor: grab; touch-action: none; }
203
+ .axis-sub { display: block; font: 400 10.5px var(--font-mono); color: var(--ink-muted); text-transform: none; letter-spacing: 0; margin-top: 2px; }
204
+ .inline-input { font: inherit; text-transform: inherit; letter-spacing: inherit; color: var(--ink); background: transparent; border: 0; border-bottom: 1px solid var(--accent); padding: 0; width: 100%; min-width: 0; outline: none; }
205
+
206
+ .drawer { position: fixed; top: 48px; right: 0; bottom: 0; width: 440px; max-width: 100vw; background: var(--bg); border-left: 1px solid var(--ink); overflow-y: auto; z-index: 40; }
207
+ .drawer-header { position: sticky; top: 0; display: flex; align-items: baseline; gap: 10px; padding: 16px 20px 12px; background: var(--bg); border-bottom: 1px solid var(--border); z-index: 1; }
208
+ .drawer-header h3 { margin: 0; font: 500 17px var(--font-sans); color: var(--ink); }
209
+ .drawer-kind { font: 11px var(--font-mono); color: var(--ink-muted); }
210
+ .drawer-body { padding: 16px 20px 24px; display: flex; flex-direction: column; gap: 18px; }
211
+ .drawer-section { display: flex; flex-direction: column; gap: 8px; padding-top: 16px; border-top: 1px dashed var(--border); }
212
+ .drawer-section h4 { margin: 0; font: 500 12px var(--font-mono); color: var(--ink); }
213
+ .drawer-footer { display: flex; align-items: center; gap: 12px; padding-top: 16px; border-top: 1px solid var(--border); }
214
+ .field { display: flex; flex-direction: column; gap: 4px; }
215
+ .field-label { font: 11px var(--font-mono); color: var(--ink-muted); }
216
+ .input { font: 13px var(--font-mono); color: var(--ink); background: transparent; border: 1px solid var(--border); padding: 5px 8px; min-width: 0; }
217
+ .input-sans { font-family: var(--font-sans); font-size: 14px; }
218
+ .help { margin: 0; font-size: 13px; color: var(--ink-muted); }
219
+ .notice { font-size: 13px; padding: 10px 12px; border-left: 3px solid var(--accent); color: var(--ink); }
220
+ .warn { font-size: 13px; padding: 8px 10px; border: 1px dashed var(--ink-muted); color: var(--ink); }
221
+ .segs { display: inline-flex; flex-wrap: wrap; }
222
+ .seg { font: 12px var(--font-mono); color: var(--ink); background: transparent; border: 1px solid var(--border); padding: 5px 10px; margin-left: -1px; cursor: pointer; }
223
+ .seg:first-child { margin-left: 0; }
224
+ .seg[aria-pressed="true"] { background: var(--ink); color: var(--bg); border-color: var(--ink); position: relative; }
225
+ .cond-row { display: grid; grid-template-columns: minmax(0, 1fr) 118px minmax(0, 1fr) 22px; gap: 6px; }
226
+ .write-row { display: grid; grid-template-columns: 84px minmax(0, 1fr) minmax(0, 1fr) 22px; gap: 6px; }
227
+ .btn { font: 12px var(--font-mono); color: var(--ink); background: transparent; border: 1px solid var(--border); padding: 6px 12px; cursor: pointer; }
228
+ .btn:hover { border-color: var(--ink); }
229
+ .btn-primary { background: var(--ink); color: var(--bg); border-color: var(--ink); }
230
+ .btn:disabled { opacity: 0.4; cursor: not-allowed; }
231
+ .link-btn { font: 12px var(--font-mono); color: var(--ink); background: none; border: 0; padding: 2px 0; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--border); }
232
+ .link-btn:hover { text-decoration-color: var(--ink); }