@dxlbnl/ui 0.1.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 (208) hide show
  1. package/README.md +94 -0
  2. package/dist/components/cards/Card.stories.svelte +82 -0
  3. package/dist/components/cards/Card.stories.svelte.d.ts +19 -0
  4. package/dist/components/cards/Card.svelte +28 -0
  5. package/dist/components/cards/Card.svelte.d.ts +12 -0
  6. package/dist/components/cards/NoteCard.stories.svelte +94 -0
  7. package/dist/components/cards/NoteCard.stories.svelte.d.ts +19 -0
  8. package/dist/components/cards/NoteCard.svelte +89 -0
  9. package/dist/components/cards/NoteCard.svelte.d.ts +18 -0
  10. package/dist/components/cards/ProductCard.stories.svelte +98 -0
  11. package/dist/components/cards/ProductCard.stories.svelte.d.ts +19 -0
  12. package/dist/components/cards/ProductCard.svelte +150 -0
  13. package/dist/components/cards/ProductCard.svelte.d.ts +22 -0
  14. package/dist/components/cards/ProjectCard.stories.svelte +88 -0
  15. package/dist/components/cards/ProjectCard.stories.svelte.d.ts +19 -0
  16. package/dist/components/cards/ProjectCard.svelte +109 -0
  17. package/dist/components/cards/ProjectCard.svelte.d.ts +20 -0
  18. package/dist/components/cards/index.d.ts +4 -0
  19. package/dist/components/cards/index.js +4 -0
  20. package/dist/components/data/Accordion.stories.svelte +316 -0
  21. package/dist/components/data/Accordion.stories.svelte.d.ts +19 -0
  22. package/dist/components/data/Accordion.svelte +23 -0
  23. package/dist/components/data/Accordion.svelte.d.ts +9 -0
  24. package/dist/components/data/AccordionItem.svelte +112 -0
  25. package/dist/components/data/AccordionItem.svelte.d.ts +11 -0
  26. package/dist/components/data/Table.composition.stories.svelte +67 -0
  27. package/dist/components/data/Table.composition.stories.svelte.d.ts +19 -0
  28. package/dist/components/data/Table.stories.svelte +137 -0
  29. package/dist/components/data/Table.stories.svelte.d.ts +19 -0
  30. package/dist/components/data/Table.svelte +83 -0
  31. package/dist/components/data/Table.svelte.d.ts +14 -0
  32. package/dist/components/data/Tabs.stories.svelte +386 -0
  33. package/dist/components/data/Tabs.stories.svelte.d.ts +19 -0
  34. package/dist/components/data/Tabs.svelte +142 -0
  35. package/dist/components/data/Tabs.svelte.d.ts +19 -0
  36. package/dist/components/data/index.d.ts +4 -0
  37. package/dist/components/data/index.js +4 -0
  38. package/dist/components/feedback/Modal.stories.svelte +192 -0
  39. package/dist/components/feedback/Modal.stories.svelte.d.ts +4 -0
  40. package/dist/components/feedback/Modal.svelte +185 -0
  41. package/dist/components/feedback/Modal.svelte.d.ts +19 -0
  42. package/dist/components/feedback/Toast.stories.svelte +203 -0
  43. package/dist/components/feedback/Toast.stories.svelte.d.ts +19 -0
  44. package/dist/components/feedback/Toast.svelte +109 -0
  45. package/dist/components/feedback/Toast.svelte.d.ts +15 -0
  46. package/dist/components/feedback/ToastRegion.stories.svelte +193 -0
  47. package/dist/components/feedback/ToastRegion.stories.svelte.d.ts +19 -0
  48. package/dist/components/feedback/ToastRegion.svelte +102 -0
  49. package/dist/components/feedback/ToastRegion.svelte.d.ts +9 -0
  50. package/dist/components/feedback/index.d.ts +3 -0
  51. package/dist/components/feedback/index.js +3 -0
  52. package/dist/components/forms/Checkbox.stories.svelte +103 -0
  53. package/dist/components/forms/Checkbox.stories.svelte.d.ts +19 -0
  54. package/dist/components/forms/Checkbox.svelte +150 -0
  55. package/dist/components/forms/Checkbox.svelte.d.ts +11 -0
  56. package/dist/components/forms/Field.stories.svelte +113 -0
  57. package/dist/components/forms/Field.stories.svelte.d.ts +19 -0
  58. package/dist/components/forms/Field.svelte +77 -0
  59. package/dist/components/forms/Field.svelte.d.ts +17 -0
  60. package/dist/components/forms/Input.stories.svelte +58 -0
  61. package/dist/components/forms/Input.stories.svelte.d.ts +19 -0
  62. package/dist/components/forms/Input.svelte +64 -0
  63. package/dist/components/forms/Input.svelte.d.ts +9 -0
  64. package/dist/components/forms/InputWrap.composition.stories.svelte +32 -0
  65. package/dist/components/forms/InputWrap.composition.stories.svelte.d.ts +19 -0
  66. package/dist/components/forms/InputWrap.stories.svelte +53 -0
  67. package/dist/components/forms/InputWrap.stories.svelte.d.ts +19 -0
  68. package/dist/components/forms/InputWrap.svelte +128 -0
  69. package/dist/components/forms/InputWrap.svelte.d.ts +21 -0
  70. package/dist/components/forms/Radio.stories.svelte +70 -0
  71. package/dist/components/forms/Radio.stories.svelte.d.ts +19 -0
  72. package/dist/components/forms/Radio.svelte +109 -0
  73. package/dist/components/forms/Radio.svelte.d.ts +9 -0
  74. package/dist/components/forms/RadioGroup.stories.svelte +115 -0
  75. package/dist/components/forms/RadioGroup.stories.svelte.d.ts +19 -0
  76. package/dist/components/forms/RadioGroup.svelte +116 -0
  77. package/dist/components/forms/RadioGroup.svelte.d.ts +24 -0
  78. package/dist/components/forms/Select.stories.svelte +168 -0
  79. package/dist/components/forms/Select.stories.svelte.d.ts +19 -0
  80. package/dist/components/forms/Select.svelte +262 -0
  81. package/dist/components/forms/Select.svelte.d.ts +23 -0
  82. package/dist/components/forms/Switch.stories.svelte +86 -0
  83. package/dist/components/forms/Switch.stories.svelte.d.ts +19 -0
  84. package/dist/components/forms/Switch.svelte +113 -0
  85. package/dist/components/forms/Switch.svelte.d.ts +11 -0
  86. package/dist/components/forms/Textarea.stories.svelte +40 -0
  87. package/dist/components/forms/Textarea.stories.svelte.d.ts +19 -0
  88. package/dist/components/forms/Textarea.svelte +66 -0
  89. package/dist/components/forms/Textarea.svelte.d.ts +9 -0
  90. package/dist/components/forms/field-context.d.ts +7 -0
  91. package/dist/components/forms/field-context.js +1 -0
  92. package/dist/components/forms/index.d.ts +9 -0
  93. package/dist/components/forms/index.js +9 -0
  94. package/dist/components/layout/Container.stories.svelte +67 -0
  95. package/dist/components/layout/Container.stories.svelte.d.ts +19 -0
  96. package/dist/components/layout/Container.svelte +52 -0
  97. package/dist/components/layout/Container.svelte.d.ts +14 -0
  98. package/dist/components/layout/Grid.stories.svelte +109 -0
  99. package/dist/components/layout/Grid.stories.svelte.d.ts +19 -0
  100. package/dist/components/layout/Grid.svelte +54 -0
  101. package/dist/components/layout/Grid.svelte.d.ts +19 -0
  102. package/dist/components/layout/Inline.stories.svelte +136 -0
  103. package/dist/components/layout/Inline.stories.svelte.d.ts +19 -0
  104. package/dist/components/layout/Inline.svelte +46 -0
  105. package/dist/components/layout/Inline.svelte.d.ts +19 -0
  106. package/dist/components/layout/Prose.stories.svelte +423 -0
  107. package/dist/components/layout/Prose.stories.svelte.d.ts +19 -0
  108. package/dist/components/layout/Prose.svelte +176 -0
  109. package/dist/components/layout/Prose.svelte.d.ts +12 -0
  110. package/dist/components/layout/Rule.stories.svelte +80 -0
  111. package/dist/components/layout/Rule.stories.svelte.d.ts +19 -0
  112. package/dist/components/layout/Rule.svelte +33 -0
  113. package/dist/components/layout/Rule.svelte.d.ts +9 -0
  114. package/dist/components/layout/Spread.stories.svelte +118 -0
  115. package/dist/components/layout/Spread.stories.svelte.d.ts +19 -0
  116. package/dist/components/layout/Spread.svelte +38 -0
  117. package/dist/components/layout/Spread.svelte.d.ts +16 -0
  118. package/dist/components/layout/Stack.stories.svelte +90 -0
  119. package/dist/components/layout/Stack.stories.svelte.d.ts +19 -0
  120. package/dist/components/layout/Stack.svelte +37 -0
  121. package/dist/components/layout/Stack.svelte.d.ts +16 -0
  122. package/dist/components/layout/index.d.ts +7 -0
  123. package/dist/components/layout/index.js +7 -0
  124. package/dist/components/navigation/Breadcrumb.stories.svelte +122 -0
  125. package/dist/components/navigation/Breadcrumb.stories.svelte.d.ts +19 -0
  126. package/dist/components/navigation/Breadcrumb.svelte +70 -0
  127. package/dist/components/navigation/Breadcrumb.svelte.d.ts +13 -0
  128. package/dist/components/navigation/Nav.stories.svelte +323 -0
  129. package/dist/components/navigation/Nav.stories.svelte.d.ts +19 -0
  130. package/dist/components/navigation/Nav.svelte +257 -0
  131. package/dist/components/navigation/Nav.svelte.d.ts +21 -0
  132. package/dist/components/navigation/index.d.ts +2 -0
  133. package/dist/components/navigation/index.js +2 -0
  134. package/dist/components/patterns/ActivityRow.stories.svelte +45 -0
  135. package/dist/components/patterns/ActivityRow.stories.svelte.d.ts +19 -0
  136. package/dist/components/patterns/ActivityRow.svelte +69 -0
  137. package/dist/components/patterns/ActivityRow.svelte.d.ts +16 -0
  138. package/dist/components/patterns/Alert.stories.svelte +63 -0
  139. package/dist/components/patterns/Alert.stories.svelte.d.ts +19 -0
  140. package/dist/components/patterns/Alert.svelte +91 -0
  141. package/dist/components/patterns/Alert.svelte.d.ts +16 -0
  142. package/dist/components/patterns/CtaBlock.stories.svelte +62 -0
  143. package/dist/components/patterns/CtaBlock.stories.svelte.d.ts +19 -0
  144. package/dist/components/patterns/CtaBlock.svelte +80 -0
  145. package/dist/components/patterns/CtaBlock.svelte.d.ts +16 -0
  146. package/dist/components/patterns/KvList.stories.svelte +48 -0
  147. package/dist/components/patterns/KvList.stories.svelte.d.ts +19 -0
  148. package/dist/components/patterns/KvList.svelte +65 -0
  149. package/dist/components/patterns/KvList.svelte.d.ts +15 -0
  150. package/dist/components/patterns/PageHero.stories.svelte +62 -0
  151. package/dist/components/patterns/PageHero.stories.svelte.d.ts +19 -0
  152. package/dist/components/patterns/PageHero.svelte +62 -0
  153. package/dist/components/patterns/PageHero.svelte.d.ts +14 -0
  154. package/dist/components/patterns/ProgressBar.stories.svelte +83 -0
  155. package/dist/components/patterns/ProgressBar.stories.svelte.d.ts +19 -0
  156. package/dist/components/patterns/ProgressBar.svelte +71 -0
  157. package/dist/components/patterns/ProgressBar.svelte.d.ts +13 -0
  158. package/dist/components/patterns/SectionFoot.stories.svelte +37 -0
  159. package/dist/components/patterns/SectionFoot.stories.svelte.d.ts +19 -0
  160. package/dist/components/patterns/SectionFoot.svelte +70 -0
  161. package/dist/components/patterns/SectionFoot.svelte.d.ts +15 -0
  162. package/dist/components/patterns/SectionHead.stories.svelte +67 -0
  163. package/dist/components/patterns/SectionHead.stories.svelte.d.ts +19 -0
  164. package/dist/components/patterns/SectionHead.svelte +54 -0
  165. package/dist/components/patterns/SectionHead.svelte.d.ts +14 -0
  166. package/dist/components/patterns/StatCard.stories.svelte +59 -0
  167. package/dist/components/patterns/StatCard.stories.svelte.d.ts +19 -0
  168. package/dist/components/patterns/StatCard.svelte +57 -0
  169. package/dist/components/patterns/StatCard.svelte.d.ts +15 -0
  170. package/dist/components/patterns/index.d.ts +9 -0
  171. package/dist/components/patterns/index.js +9 -0
  172. package/dist/components/primitives/Button.stories.svelte +132 -0
  173. package/dist/components/primitives/Button.stories.svelte.d.ts +19 -0
  174. package/dist/components/primitives/Button.svelte +142 -0
  175. package/dist/components/primitives/Button.svelte.d.ts +16 -0
  176. package/dist/components/primitives/Heading.stories.svelte +137 -0
  177. package/dist/components/primitives/Heading.stories.svelte.d.ts +19 -0
  178. package/dist/components/primitives/Heading.svelte +107 -0
  179. package/dist/components/primitives/Heading.svelte.d.ts +23 -0
  180. package/dist/components/primitives/Led.stories.svelte +63 -0
  181. package/dist/components/primitives/Led.stories.svelte.d.ts +19 -0
  182. package/dist/components/primitives/Led.svelte +65 -0
  183. package/dist/components/primitives/Led.svelte.d.ts +11 -0
  184. package/dist/components/primitives/TagPill.stories.svelte +90 -0
  185. package/dist/components/primitives/TagPill.stories.svelte.d.ts +19 -0
  186. package/dist/components/primitives/TagPill.svelte +44 -0
  187. package/dist/components/primitives/TagPill.svelte.d.ts +9 -0
  188. package/dist/components/primitives/Text.stories.svelte +252 -0
  189. package/dist/components/primitives/Text.stories.svelte.d.ts +19 -0
  190. package/dist/components/primitives/Text.svelte +101 -0
  191. package/dist/components/primitives/Text.svelte.d.ts +25 -0
  192. package/dist/components/primitives/index.d.ts +5 -0
  193. package/dist/components/primitives/index.js +5 -0
  194. package/dist/index.d.ts +10 -0
  195. package/dist/index.js +10 -0
  196. package/dist/stores/toast.d.ts +19 -0
  197. package/dist/stores/toast.js +22 -0
  198. package/dist/storybook-utils.d.ts +11 -0
  199. package/dist/storybook-utils.js +29 -0
  200. package/dist/tokens/ColorSwatch.svelte +73 -0
  201. package/dist/tokens/ColorSwatch.svelte.d.ts +10 -0
  202. package/dist/tokens/layout.css +144 -0
  203. package/dist/tokens/patterns.css +281 -0
  204. package/dist/tokens/tokens.css +96 -0
  205. package/dist/tokens/tokens.stories.svelte +107 -0
  206. package/dist/tokens/tokens.stories.svelte.d.ts +18 -0
  207. package/dist/tokens/typography.css +159 -0
  208. package/package.json +62 -0
@@ -0,0 +1,144 @@
1
+ /* =========================================================
2
+ DEXTERLABS // LAYOUT HELPERS
3
+ Depends on: tokens.css
4
+ ========================================================= */
5
+
6
+ /* ── Container ──────────────────────────────────────────── */
7
+ .container {
8
+ max-width: 1440px;
9
+ margin: 0 auto;
10
+ padding: 0 32px 80px;
11
+ container-type: inline-size;
12
+ }
13
+
14
+ .container-md {
15
+ max-width: 960px;
16
+ margin: 0 auto;
17
+ padding: 0 32px 64px;
18
+ container-type: inline-size;
19
+ }
20
+
21
+ .container-sm {
22
+ max-width: 640px;
23
+ margin: 0 auto;
24
+ padding: 0 32px 48px;
25
+ container-type: inline-size;
26
+ }
27
+
28
+ @media (max-width: 720px) {
29
+ .container,
30
+ .container-md,
31
+ .container-sm {
32
+ padding-left: 16px;
33
+ padding-right: 16px;
34
+ }
35
+ }
36
+
37
+ /* ── Rail (fixed sidebar + scrollable main) ─────────────── */
38
+ .rail-layout {
39
+ display: flex;
40
+ height: 100vh;
41
+ overflow: hidden;
42
+ }
43
+
44
+ .rail-sidebar {
45
+ width: 200px;
46
+ flex-shrink: 0;
47
+ border-right: 1px solid var(--rule);
48
+ background: var(--bg-rail);
49
+ display: flex;
50
+ flex-direction: column;
51
+ overflow-y: auto;
52
+ }
53
+
54
+ .rail-main {
55
+ flex: 1;
56
+ overflow-y: auto;
57
+ padding: 32px;
58
+ background: var(--bg);
59
+ }
60
+
61
+ @media (max-width: 720px) {
62
+ .rail-sidebar { display: none; }
63
+ .rail-main { padding: 16px; }
64
+ }
65
+
66
+ /* ── Grids ───────────────────────────────────────────────── */
67
+ .grid { display: grid; gap: var(--gap, 16px); }
68
+ .grid-1 { grid-template-columns: 1fr; }
69
+ .grid-2 { grid-template-columns: repeat(2, 1fr); }
70
+ .grid-3 { grid-template-columns: repeat(3, 1fr); }
71
+ .grid-4 { grid-template-columns: repeat(4, 1fr); }
72
+ .grid-auto { grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
73
+
74
+ /* Card grid: 3 → 2 → 1 col via container query */
75
+ .card-grid {
76
+ display: grid;
77
+ grid-template-columns: repeat(3, 1fr);
78
+ gap: 16px;
79
+ container-type: inline-size;
80
+ }
81
+
82
+ @container (max-width: 900px) { .card-grid { grid-template-columns: 1fr 1fr; } }
83
+ @container (max-width: 720px) { .card-grid { grid-template-columns: 1fr; } }
84
+
85
+ /* Split layouts */
86
+ .split {
87
+ display: grid;
88
+ grid-template-columns: 1fr 1fr;
89
+ gap: var(--gap, 32px);
90
+ }
91
+
92
+ .split-aside {
93
+ display: grid;
94
+ grid-template-columns: 280px 1fr;
95
+ gap: var(--gap, 32px);
96
+ }
97
+
98
+ @container (max-width: 720px) {
99
+ .split,
100
+ .split-aside { grid-template-columns: 1fr; }
101
+ }
102
+
103
+ /* ── Flex stacks ─────────────────────────────────────────── */
104
+ .stack { display: flex; flex-direction: column; gap: var(--gap, 16px); }
105
+ .stack-sm { --gap: 8px; }
106
+ .stack-lg { --gap: 32px; }
107
+
108
+ .inline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--gap, 12px); }
109
+ .inline-sm { --gap: 6px; }
110
+ .inline-lg { --gap: 24px; }
111
+
112
+ .spread { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
113
+
114
+ /* ── Dividers ────────────────────────────────────────────── */
115
+ .rule { border: none; border-top: 1px solid var(--rule); margin: 0; }
116
+ .rule-dashed { border: none; border-top: 1px dashed var(--rule); margin: 0; }
117
+ .rule-strong { border: none; border-top: 1px solid var(--rule-strong); margin: 0; }
118
+
119
+ /* ── Padding utilities ───────────────────────────────────── */
120
+ .p-1 { padding: 8px; }
121
+ .p-2 { padding: 16px; }
122
+ .p-3 { padding: 24px; }
123
+ .p-4 { padding: 32px; }
124
+ .px-2 { padding-left: 16px; padding-right: 16px; }
125
+ .px-4 { padding-left: 32px; padding-right: 32px; }
126
+ .py-2 { padding-top: 16px; padding-bottom: 16px; }
127
+ .py-5 { padding-top: 40px; padding-bottom: 40px; }
128
+
129
+ /* ── Surface helpers ─────────────────────────────────────── */
130
+ .surface-rail { background: var(--bg-rail); }
131
+ .surface-elev { background: var(--bg-elev); }
132
+ .surface-sunken { background: var(--bg-sunken); }
133
+
134
+ /* ── Border helpers ──────────────────────────────────────── */
135
+ .bordered { border: 1px solid var(--rule); }
136
+ .bordered-strong { border: 1px solid var(--rule-strong); }
137
+ .bordered-amber { border: 1px solid var(--amber); }
138
+
139
+ /* ── Visibility ──────────────────────────────────────────── */
140
+ .hidden { display: none !important; }
141
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); }
142
+
143
+ @media (max-width: 720px) { .hide-mobile { display: none; } }
144
+ @media (min-width: 721px) { .hide-desktop { display: none; } }
@@ -0,0 +1,281 @@
1
+ /* =========================================================
2
+ DEXTERLABS // PATTERNS
3
+ Composite component patterns built on design tokens.
4
+ Depends on: tokens.css + layout.css
5
+ ========================================================= */
6
+
7
+ /* ── Page hero ───────────────────────────────────────────── */
8
+ .page-hero { padding: 48px 0 40px; }
9
+ .page-hero.bordered { border-bottom: 1px solid var(--rule); }
10
+
11
+ .page-hero .eyebrow {
12
+ font-family: var(--mono);
13
+ font-size: var(--t-micro);
14
+ letter-spacing: 0.12em;
15
+ color: var(--ink-faint);
16
+ text-transform: uppercase;
17
+ margin-bottom: 12px;
18
+ }
19
+
20
+ .page-hero h1 {
21
+ font-weight: 500;
22
+ font-size: var(--t-hero);
23
+ line-height: 1;
24
+ letter-spacing: -0.03em;
25
+ margin: 0;
26
+ }
27
+
28
+ .page-hero h1 em { font-style: normal; color: var(--ink-faint); }
29
+
30
+ .page-hero .sub {
31
+ margin-top: 20px;
32
+ font-size: var(--t-lede);
33
+ color: var(--ink-dim);
34
+ line-height: 1.55;
35
+ max-width: 62ch;
36
+ }
37
+
38
+ /* ── Section head ────────────────────────────────────────── */
39
+ .section-head {
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: 6px;
43
+ padding: 40px 0 12px;
44
+ border-bottom: 1px solid var(--rule);
45
+ }
46
+
47
+ .section-head .num {
48
+ font-family: var(--mono);
49
+ font-size: var(--t-mono);
50
+ color: var(--ink-faint);
51
+ letter-spacing: 0.12em;
52
+ }
53
+
54
+ .section-head .row { display: flex; align-items: baseline; gap: 16px; }
55
+
56
+ .section-head h2 {
57
+ font-weight: 500;
58
+ font-size: var(--t-h3);
59
+ letter-spacing: -0.01em;
60
+ margin: 0;
61
+ }
62
+
63
+ .section-head .sub {
64
+ margin-left: auto;
65
+ font-family: var(--mono);
66
+ font-size: var(--t-mono);
67
+ color: var(--ink-dim);
68
+ letter-spacing: 0.08em;
69
+ text-transform: uppercase;
70
+ }
71
+
72
+ /* ── Section foot ────────────────────────────────────────── */
73
+ .section-foot {
74
+ display: flex;
75
+ justify-content: space-between;
76
+ align-items: baseline;
77
+ font-family: var(--mono);
78
+ font-size: var(--t-mono);
79
+ letter-spacing: 0.06em;
80
+ padding-top: 16px;
81
+ margin-top: 20px;
82
+ border-top: 1px solid var(--rule);
83
+ }
84
+
85
+ .section-foot .link {
86
+ color: var(--amber);
87
+ text-transform: uppercase;
88
+ cursor: pointer;
89
+ transition: color var(--transition);
90
+ }
91
+ .section-foot .link:hover { color: var(--ink); }
92
+
93
+ .section-foot .meta {
94
+ color: var(--ink-faint);
95
+ text-transform: uppercase;
96
+ font-size: var(--t-micro);
97
+ }
98
+
99
+ /* ── Stat card ───────────────────────────────────────────── */
100
+ .stat-card {
101
+ border: 1px solid var(--rule);
102
+ background: var(--bg-rail);
103
+ padding: 16px 20px;
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 6px;
107
+ }
108
+
109
+ .stat-card .stat-label {
110
+ font-family: var(--mono);
111
+ font-size: var(--t-micro);
112
+ letter-spacing: 0.1em;
113
+ text-transform: uppercase;
114
+ color: var(--ink-faint);
115
+ }
116
+
117
+ .stat-card .stat-value {
118
+ font-family: var(--mono);
119
+ font-size: 32px;
120
+ letter-spacing: -0.02em;
121
+ line-height: 1;
122
+ color: var(--ink);
123
+ }
124
+ .stat-card .stat-value.amber { color: var(--amber); }
125
+ .stat-card .stat-value.ok { color: var(--ok); }
126
+ .stat-card .stat-value.danger { color: var(--danger); }
127
+
128
+ .stat-card .stat-sub {
129
+ font-family: var(--mono);
130
+ font-size: var(--t-micro);
131
+ color: var(--ink-faint);
132
+ letter-spacing: 0.04em;
133
+ text-transform: uppercase;
134
+ }
135
+
136
+ /* ── Key-value list ──────────────────────────────────────── */
137
+ .kv-list { display: flex; flex-direction: column; }
138
+
139
+ .kv-row {
140
+ display: flex;
141
+ justify-content: space-between;
142
+ align-items: baseline;
143
+ gap: 16px;
144
+ padding: 6px 0;
145
+ border-bottom: 1px dashed var(--rule);
146
+ font-family: var(--mono);
147
+ font-size: var(--t-mono);
148
+ }
149
+ .kv-row:last-child { border-bottom: none; }
150
+
151
+ .kv-key {
152
+ color: var(--ink-faint);
153
+ letter-spacing: 0.06em;
154
+ text-transform: uppercase;
155
+ flex-shrink: 0;
156
+ }
157
+
158
+ .kv-val { color: var(--ink); text-align: right; }
159
+ .kv-val.amber { color: var(--amber); }
160
+ .kv-val.ok { color: var(--ok); }
161
+ .kv-val.danger { color: var(--danger); }
162
+ .kv-val.cyan { color: var(--cyan); }
163
+
164
+ /* ── Alert ───────────────────────────────────────────────── */
165
+ .alert {
166
+ display: flex;
167
+ align-items: flex-start;
168
+ gap: 12px;
169
+ padding: 12px 16px;
170
+ border-left: 2px solid;
171
+ font-size: var(--t-body);
172
+ line-height: 1.5;
173
+ }
174
+ .alert.ok { border-color: var(--ok); background: color-mix(in srgb, var(--ok) 8%, transparent); }
175
+ .alert.amber { border-color: var(--amber); background: color-mix(in srgb, var(--amber) 8%, transparent); }
176
+ .alert.danger { border-color: var(--danger); background: color-mix(in srgb, var(--danger) 8%, transparent); }
177
+ .alert.info { border-color: var(--cyan); background: color-mix(in srgb, var(--cyan) 8%, transparent); }
178
+
179
+ .alert .alert-tag {
180
+ font-family: var(--mono);
181
+ font-size: var(--t-micro);
182
+ letter-spacing: 0.08em;
183
+ text-transform: uppercase;
184
+ flex-shrink: 0;
185
+ margin-top: 2px;
186
+ }
187
+ .alert.ok .alert-tag { color: var(--ok); }
188
+ .alert.amber .alert-tag { color: var(--amber); }
189
+ .alert.danger .alert-tag { color: var(--danger); }
190
+ .alert.info .alert-tag { color: var(--cyan); }
191
+
192
+ .alert .alert-body { display: flex; flex-direction: column; gap: 2px; }
193
+
194
+ .alert .alert-title {
195
+ font-family: var(--mono);
196
+ font-size: var(--t-micro);
197
+ letter-spacing: 0.08em;
198
+ text-transform: uppercase;
199
+ }
200
+ .alert.ok .alert-title { color: var(--ok); }
201
+ .alert.amber .alert-title { color: var(--amber); }
202
+ .alert.danger .alert-title { color: var(--danger); }
203
+ .alert.info .alert-title { color: var(--cyan); }
204
+
205
+ .alert .alert-msg { font-size: var(--t-mono); color: var(--ink-dim); line-height: 1.5; }
206
+
207
+ /* ── CTA block ───────────────────────────────────────────── */
208
+ .cta-block {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: space-between;
212
+ gap: 24px;
213
+ border: 1px solid var(--amber);
214
+ padding: 24px 32px;
215
+ color: inherit;
216
+ transition: background var(--transition);
217
+ cursor: pointer;
218
+ }
219
+ .cta-block:hover { background: color-mix(in srgb, var(--amber) 6%, transparent); }
220
+
221
+ .cta-block .cta-body { display: flex; flex-direction: column; gap: 3px; }
222
+
223
+ .cta-block .cta-eyebrow {
224
+ font-family: var(--mono);
225
+ font-size: var(--t-micro);
226
+ letter-spacing: 0.12em;
227
+ color: var(--ink-faint);
228
+ text-transform: uppercase;
229
+ }
230
+
231
+ .cta-block .cta-name {
232
+ font-weight: 500;
233
+ font-size: var(--t-lede);
234
+ letter-spacing: -0.01em;
235
+ }
236
+
237
+ .cta-block .cta-desc { font-size: var(--t-mono); color: var(--ink-dim); line-height: 1.4; }
238
+
239
+ .cta-block .cta-link {
240
+ font-family: var(--mono);
241
+ font-size: var(--t-mono);
242
+ letter-spacing: 0.08em;
243
+ text-transform: uppercase;
244
+ color: var(--amber);
245
+ white-space: nowrap;
246
+ flex-shrink: 0;
247
+ }
248
+
249
+ /* ── Progress bar ────────────────────────────────────────── */
250
+ .progress { display: flex; flex-direction: column; gap: 4px; width: 100%; }
251
+
252
+ .progress-header {
253
+ display: flex;
254
+ justify-content: space-between;
255
+ font-family: var(--mono);
256
+ font-size: var(--t-micro);
257
+ letter-spacing: 0.08em;
258
+ text-transform: uppercase;
259
+ color: var(--ink-faint);
260
+ }
261
+
262
+ .progress-track { height: 5px; background: var(--bg-sunken); border: 1px solid var(--rule); }
263
+ .progress-fill { height: 100%; background: var(--ok); transition: width 0.3s; }
264
+ .progress-fill.amber { background: var(--amber); }
265
+ .progress-fill.danger { background: var(--danger); }
266
+
267
+ /* ── Activity row ────────────────────────────────────────── */
268
+ .activity-row {
269
+ display: flex;
270
+ gap: 12px;
271
+ align-items: center;
272
+ padding: 7px 0;
273
+ border-bottom: 1px dashed var(--rule);
274
+ font-family: var(--mono);
275
+ font-size: var(--t-micro);
276
+ letter-spacing: 0.04em;
277
+ }
278
+ .activity-row:last-child { border-bottom: none; }
279
+
280
+ .activity-time { color: var(--ink-faint); flex-shrink: 0; }
281
+ .activity-msg { color: var(--ink-dim); flex: 1; }
@@ -0,0 +1,96 @@
1
+ /* =========================================================
2
+ DEXTERLABS // DESIGN TOKENS
3
+ Two palettes: phosphor (dark default) + paper (light)
4
+ Toggle via [data-palette="paper"] on <html>
5
+ ========================================================= */
6
+
7
+ /* ── Phosphor palette (dark default) ──────────────────── */
8
+ :root {
9
+
10
+ /* Surfaces */
11
+ --bg: #0b0d0c; /* page background */
12
+ --bg-rail: #0f1211; /* cards, nav, sidebars */
13
+ --bg-elev: #141817; /* elevated surfaces, inline-code bg */
14
+ --bg-sunken: #070908; /* code blocks, status bar, sunken wells */
15
+
16
+ /* Ink */
17
+ --ink: #d6e2dc; /* primary text */
18
+ --ink-dim: #a4b0a9; /* secondary / muted text */
19
+ --ink-faint: #7a8580; /* metadata, tertiary, placeholders */
20
+
21
+ /* Rules */
22
+ --rule: #1d2321; /* default borders — barely visible */
23
+ --rule-strong: #2a3330; /* emphasised borders */
24
+
25
+ /* Accents */
26
+ --amber: #ffb347; /* primary accent — CTAs, prices, active, LED */
27
+ --cyan: #7cc7d1; /* secondary — code functions, kind labels, LED */
28
+ --danger: #ff7a6b; /* error / destructive */
29
+ --ok: #8fd48a; /* success / online status */
30
+
31
+ /* Font stacks */
32
+ --mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
33
+ --sans: "Inter Tight", "Inter", ui-sans-serif, system-ui, sans-serif;
34
+
35
+ /* Type scale */
36
+ --t-micro: 12px;
37
+ --t-mono: 14px;
38
+ --t-body: 16px;
39
+ --t-lede: 19px;
40
+ --t-h3: 24px;
41
+ --t-h2: 36px;
42
+ --t-h1: 72px;
43
+ --t-display: 140px;
44
+ --t-hero: clamp(48px, 8vw, 112px);
45
+ --t-title: clamp(36px, 5vw, 56px);
46
+ --t-subtitle: clamp(22px, 3.5vw, 40px);
47
+
48
+ /* Spacing — base unit 8px */
49
+ --u: 8px;
50
+ --u2: 16px;
51
+ --u3: 24px;
52
+ --u4: 32px;
53
+ --u5: 40px;
54
+ --u6: 48px;
55
+ --u7: 56px;
56
+ --u10: 80px;
57
+
58
+ /* Radius */
59
+ --radius: 2px; /* buttons, pills, inline code */
60
+ --radius-card: 4px; /* cards */
61
+
62
+ /* Transitions — color/background only, no transforms */
63
+ --transition: 0.15s;
64
+
65
+ /* Shiki syntax highlighting */
66
+ --shiki-foreground: var(--ink);
67
+ --shiki-background: var(--bg-sunken);
68
+ --shiki-token-keyword: var(--amber);
69
+ --shiki-token-function: var(--cyan);
70
+ --shiki-token-constant: var(--amber);
71
+ --shiki-token-string: #7ec8a0;
72
+ --shiki-token-string-expression: #7ec8a0;
73
+ --shiki-token-comment: var(--ink-faint);
74
+ --shiki-token-parameter: var(--ink-dim);
75
+ --shiki-token-punctuation: var(--ink-dim);
76
+ --shiki-token-link: var(--cyan);
77
+ }
78
+
79
+ /* ── Paper palette (light) ─────────────────────────────── */
80
+ [data-palette="paper"] {
81
+ --bg: #efece4;
82
+ --bg-rail: #e6e2d6;
83
+ --bg-elev: #f5f2ea;
84
+ --bg-sunken: #dfdbce;
85
+ --ink: #14110b;
86
+ --ink-dim: #3f3b30;
87
+ --ink-faint: #5f5a4a;
88
+ --rule: #cfcabc;
89
+ --rule-strong: #a8a192;
90
+ --amber: #a04e00;
91
+ --cyan: #030304;
92
+ --danger: #a83224;
93
+ --ok: #356b31;
94
+ --shiki-token-string: #2d7a50;
95
+ --shiki-token-string-expression: #2d7a50;
96
+ }
@@ -0,0 +1,107 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import { expect, within } from "storybook/test";
4
+ import ColorSwatch from "./ColorSwatch.svelte";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Design Tokens/Palette",
8
+ parameters: { layout: "fullscreen" },
9
+ });
10
+
11
+ const colorGroups = [
12
+ { label: "Surfaces", tokens: ["--bg", "--bg-rail", "--bg-elev", "--bg-sunken"] },
13
+ { label: "Ink", tokens: ["--ink", "--ink-dim", "--ink-faint"] },
14
+ { label: "Rules", tokens: ["--rule", "--rule-strong"] },
15
+ { label: "Accents", tokens: ["--amber", "--cyan", "--danger", "--ok"] },
16
+ ];
17
+ </script>
18
+
19
+ <Story name="Color Palette"
20
+ play={async ({ canvasElement }) => {
21
+ const canvas = within(canvasElement);
22
+ const bgSwatch = canvas.getByTestId("--bg");
23
+ await expect(getComputedStyle(bgSwatch).backgroundColor.startsWith("rgb")).toBe(true);
24
+ const amberSwatch = canvas.getByTestId("--amber");
25
+ await expect(getComputedStyle(amberSwatch).backgroundColor).not.toBe("rgba(0, 0, 0, 0)");
26
+ }}>
27
+ <ColorSwatch groups={colorGroups} />
28
+ </Story>
29
+
30
+ <Story name="Typography Scale"
31
+ play={async ({ canvasElement }) => {
32
+ const canvas = within(canvasElement);
33
+ await expect(getComputedStyle(canvas.getByTestId("scale-h1")).fontSize).toBe("72px");
34
+ await expect(getComputedStyle(canvas.getByTestId("scale-h2")).fontSize).toBe("36px");
35
+ await expect(getComputedStyle(canvas.getByTestId("scale-h3")).fontSize).toBe("24px");
36
+ await expect(getComputedStyle(canvas.getByTestId("scale-lede")).fontSize).toBe("19px");
37
+ await expect(getComputedStyle(canvas.getByTestId("scale-body")).fontSize).toBe("16px");
38
+ const mono = canvas.getByTestId("scale-mono");
39
+ await expect(getComputedStyle(mono).textTransform).toBe("uppercase");
40
+ await expect(getComputedStyle(mono).fontFamily.toLowerCase().includes("jetbrains") || getComputedStyle(mono).fontFamily.toLowerCase().includes("mono")).toBe(true);
41
+ const eyebrow = canvas.getByTestId("scale-eyebrow");
42
+ await expect(getComputedStyle(eyebrow).fontSize).toBe("12px");
43
+ }}>
44
+ <div style="padding: 24px; background: var(--bg); color: var(--ink); display: flex; flex-direction: column; gap: 20px;">
45
+ <div>
46
+ <p class="eyebrow" style="margin-bottom: 6px; color: var(--ink-faint);">.display-heading</p>
47
+ <div class="display-heading" style="overflow: hidden; line-height: 1; max-height: 160px;">Dx</div>
48
+ </div>
49
+ <div>
50
+ <p class="eyebrow" style="margin-bottom: 6px; color: var(--ink-faint);">.hero-heading</p>
51
+ <div class="hero-heading" style="overflow: hidden; white-space: nowrap;">Dexterlabs</div>
52
+ </div>
53
+ <div style="border-top: 1px solid var(--rule); padding-top: 20px; display: flex; flex-direction: column; gap: 16px;">
54
+ <div data-testid="scale-h1" class="h1">H1 — Design System</div>
55
+ <div data-testid="scale-h2" class="h2">H2 — Design System</div>
56
+ <div data-testid="scale-h3" class="h3">H3 — Design System</div>
57
+ </div>
58
+ <div style="border-top: 1px solid var(--rule); padding-top: 20px; display: flex; flex-direction: column; gap: 12px;">
59
+ <p data-testid="scale-lede" class="body-lede">Lede — a brief, impactful opening sentence that draws the reader in.</p>
60
+ <p data-testid="scale-body" class="body-text">Body text — the quick brown fox jumps over the lazy dog.</p>
61
+ <div data-testid="scale-mono" class="mono-label">Status · Active · v1.0</div>
62
+ <p data-testid="scale-eyebrow" class="eyebrow">Category label</p>
63
+ </div>
64
+ </div>
65
+ </Story>
66
+
67
+ <Story name="Spacing Scale"
68
+ play={async ({ canvasElement }) => {
69
+ await expect(canvasElement.firstElementChild).toBeVisible();
70
+ const probe = document.createElement("div");
71
+ probe.style.width = "var(--u4)";
72
+ document.body.appendChild(probe);
73
+ const resolved = getComputedStyle(probe).width;
74
+ document.body.removeChild(probe);
75
+ await expect(resolved).toBe("32px");
76
+ }}>
77
+ <div style="padding: 24px; background: var(--bg); color: var(--ink); display: flex; flex-direction: column; gap: 16px;">
78
+ <p class="eyebrow" style="color: var(--ink-faint); margin-bottom: 8px;">Spacing Scale — base unit 8px</p>
79
+ <div style="display: flex; flex-direction: column; gap: 12px;">
80
+ <div style="display: flex; align-items: center; gap: 16px;">
81
+ <span class="mono-label" style="width: 60px; color: var(--ink-faint);">--u</span>
82
+ <div style="height: 16px; width: var(--u); background: var(--amber);"></div>
83
+ <span class="mono-label" style="color: var(--ink-dim);">8px</span>
84
+ </div>
85
+ <div style="display: flex; align-items: center; gap: 16px;">
86
+ <span class="mono-label" style="width: 60px; color: var(--ink-faint);">--u2</span>
87
+ <div style="height: 16px; width: var(--u2); background: var(--amber);"></div>
88
+ <span class="mono-label" style="color: var(--ink-dim);">16px</span>
89
+ </div>
90
+ <div style="display: flex; align-items: center; gap: 16px;">
91
+ <span class="mono-label" style="width: 60px; color: var(--ink-faint);">--u3</span>
92
+ <div style="height: 16px; width: var(--u3); background: var(--amber);"></div>
93
+ <span class="mono-label" style="color: var(--ink-dim);">24px</span>
94
+ </div>
95
+ <div style="display: flex; align-items: center; gap: 16px;">
96
+ <span class="mono-label" style="width: 60px; color: var(--ink-faint);">--u4</span>
97
+ <div style="height: 16px; width: var(--u4); background: var(--amber);"></div>
98
+ <span class="mono-label" style="color: var(--ink-dim);">32px</span>
99
+ </div>
100
+ <div style="display: flex; align-items: center; gap: 16px;">
101
+ <span class="mono-label" style="width: 60px; color: var(--ink-faint);">--u5</span>
102
+ <div style="height: 16px; width: var(--u5); background: var(--amber);"></div>
103
+ <span class="mono-label" style="color: var(--ink-dim);">40px</span>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </Story>
@@ -0,0 +1,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const Tokens: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type Tokens = InstanceType<typeof Tokens>;
18
+ export default Tokens;