@softure-ai/theme-notion 0.0.0-stage → 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 (247) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +114 -2
  4. package/dist/index.d.ts +47 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +49 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/lib/utils.d.ts +6 -0
  9. package/dist/lib/utils.d.ts.map +1 -0
  10. package/dist/lib/utils.js +8 -0
  11. package/dist/lib/utils.js.map +1 -0
  12. package/dist/messages/en.d.ts +29 -0
  13. package/dist/messages/en.d.ts.map +1 -0
  14. package/dist/messages/en.js +13 -0
  15. package/dist/messages/en.js.map +1 -0
  16. package/dist/messages/index.d.ts +30 -0
  17. package/dist/messages/index.d.ts.map +1 -0
  18. package/dist/messages/index.js +4 -0
  19. package/dist/messages/index.js.map +1 -0
  20. package/dist/notion/PageFrame.d.ts +11 -0
  21. package/dist/notion/PageFrame.d.ts.map +1 -0
  22. package/dist/notion/PageFrame.js +10 -0
  23. package/dist/notion/PageFrame.js.map +1 -0
  24. package/dist/notion/PageHeader.d.ts +16 -0
  25. package/dist/notion/PageHeader.d.ts.map +1 -0
  26. package/dist/notion/PageHeader.js +9 -0
  27. package/dist/notion/PageHeader.js.map +1 -0
  28. package/dist/notion/PropertyList.d.ts +12 -0
  29. package/dist/notion/PropertyList.d.ts.map +1 -0
  30. package/dist/notion/PropertyList.js +8 -0
  31. package/dist/notion/PropertyList.js.map +1 -0
  32. package/dist/notion/Status.d.ts +11 -0
  33. package/dist/notion/Status.d.ts.map +1 -0
  34. package/dist/notion/Status.js +21 -0
  35. package/dist/notion/Status.js.map +1 -0
  36. package/dist/notion/icon-stroke.d.ts +2 -0
  37. package/dist/notion/icon-stroke.d.ts.map +1 -0
  38. package/dist/notion/icon-stroke.js +3 -0
  39. package/dist/notion/icon-stroke.js.map +1 -0
  40. package/dist/notion/palette.d.ts +3 -0
  41. package/dist/notion/palette.d.ts.map +1 -0
  42. package/dist/notion/palette.js +4 -0
  43. package/dist/notion/palette.js.map +1 -0
  44. package/dist/sft-bridge.css +47 -0
  45. package/dist/theme.css +388 -0
  46. package/dist/tokens.d.ts +801 -0
  47. package/dist/tokens.d.ts.map +1 -0
  48. package/dist/tokens.js +139 -0
  49. package/dist/tokens.js.map +1 -0
  50. package/dist/ui/accordion.d.ts +8 -0
  51. package/dist/ui/accordion.d.ts.map +1 -0
  52. package/dist/ui/accordion.js +20 -0
  53. package/dist/ui/accordion.js.map +1 -0
  54. package/dist/ui/alert-dialog.d.ts +19 -0
  55. package/dist/ui/alert-dialog.d.ts.map +1 -0
  56. package/dist/ui/alert-dialog.js +44 -0
  57. package/dist/ui/alert-dialog.js.map +1 -0
  58. package/dist/ui/alert.d.ts +10 -0
  59. package/dist/ui/alert.d.ts.map +1 -0
  60. package/dist/ui/alert.js +35 -0
  61. package/dist/ui/alert.js.map +1 -0
  62. package/dist/ui/avatar.d.ts +12 -0
  63. package/dist/ui/avatar.d.ts.map +1 -0
  64. package/dist/ui/avatar.js +25 -0
  65. package/dist/ui/avatar.js.map +1 -0
  66. package/dist/ui/badge.d.ts +11 -0
  67. package/dist/ui/badge.d.ts.map +1 -0
  68. package/dist/ui/badge.js +41 -0
  69. package/dist/ui/badge.js.map +1 -0
  70. package/dist/ui/breadcrumb.d.ts +14 -0
  71. package/dist/ui/breadcrumb.d.ts.map +1 -0
  72. package/dist/ui/breadcrumb.js +30 -0
  73. package/dist/ui/breadcrumb.js.map +1 -0
  74. package/dist/ui/button-group.d.ts +12 -0
  75. package/dist/ui/button-group.d.ts.map +1 -0
  76. package/dist/ui/button-group.js +28 -0
  77. package/dist/ui/button-group.js.map +1 -0
  78. package/dist/ui/button.d.ts +11 -0
  79. package/dist/ui/button.d.ts.map +1 -0
  80. package/dist/ui/button.js +37 -0
  81. package/dist/ui/button.js.map +1 -0
  82. package/dist/ui/card.d.ts +10 -0
  83. package/dist/ui/card.d.ts.map +1 -0
  84. package/dist/ui/card.js +26 -0
  85. package/dist/ui/card.js.map +1 -0
  86. package/dist/ui/checkbox.d.ts +5 -0
  87. package/dist/ui/checkbox.d.ts.map +1 -0
  88. package/dist/ui/checkbox.js +11 -0
  89. package/dist/ui/checkbox.js.map +1 -0
  90. package/dist/ui/collapsible.d.ts +6 -0
  91. package/dist/ui/collapsible.d.ts.map +1 -0
  92. package/dist/ui/collapsible.js +14 -0
  93. package/dist/ui/collapsible.js.map +1 -0
  94. package/dist/ui/command.d.ts +19 -0
  95. package/dist/ui/command.d.ts.map +1 -0
  96. package/dist/ui/command.js +37 -0
  97. package/dist/ui/command.js.map +1 -0
  98. package/dist/ui/dialog.d.ts +19 -0
  99. package/dist/ui/dialog.d.ts.map +1 -0
  100. package/dist/ui/dialog.js +40 -0
  101. package/dist/ui/dialog.js.map +1 -0
  102. package/dist/ui/dropdown-menu.d.ts +26 -0
  103. package/dist/ui/dropdown-menu.d.ts.map +1 -0
  104. package/dist/ui/dropdown-menu.js +53 -0
  105. package/dist/ui/dropdown-menu.js.map +1 -0
  106. package/dist/ui/empty.d.ts +12 -0
  107. package/dist/ui/empty.d.ts.map +1 -0
  108. package/dist/ui/empty.js +34 -0
  109. package/dist/ui/empty.js.map +1 -0
  110. package/dist/ui/field.d.ts +25 -0
  111. package/dist/ui/field.d.ts.map +1 -0
  112. package/dist/ui/field.js +77 -0
  113. package/dist/ui/field.js.map +1 -0
  114. package/dist/ui/input-group.d.ts +17 -0
  115. package/dist/ui/input-group.d.ts.map +1 -0
  116. package/dist/ui/input-group.js +65 -0
  117. package/dist/ui/input-group.js.map +1 -0
  118. package/dist/ui/input.d.ts +4 -0
  119. package/dist/ui/input.d.ts.map +1 -0
  120. package/dist/ui/input.js +8 -0
  121. package/dist/ui/input.js.map +1 -0
  122. package/dist/ui/item.d.ts +24 -0
  123. package/dist/ui/item.d.ts.map +1 -0
  124. package/dist/ui/item.js +68 -0
  125. package/dist/ui/item.js.map +1 -0
  126. package/dist/ui/kbd.d.ts +4 -0
  127. package/dist/ui/kbd.d.ts.map +1 -0
  128. package/dist/ui/kbd.js +10 -0
  129. package/dist/ui/kbd.js.map +1 -0
  130. package/dist/ui/label.d.ts +5 -0
  131. package/dist/ui/label.d.ts.map +1 -0
  132. package/dist/ui/label.js +10 -0
  133. package/dist/ui/label.js.map +1 -0
  134. package/dist/ui/popover.d.ts +11 -0
  135. package/dist/ui/popover.d.ts.map +1 -0
  136. package/dist/ui/popover.js +28 -0
  137. package/dist/ui/popover.js.map +1 -0
  138. package/dist/ui/progress.d.ts +5 -0
  139. package/dist/ui/progress.d.ts.map +1 -0
  140. package/dist/ui/progress.js +10 -0
  141. package/dist/ui/progress.js.map +1 -0
  142. package/dist/ui/scroll-area.d.ts +6 -0
  143. package/dist/ui/scroll-area.d.ts.map +1 -0
  144. package/dist/ui/scroll-area.js +15 -0
  145. package/dist/ui/scroll-area.js.map +1 -0
  146. package/dist/ui/select.d.ts +16 -0
  147. package/dist/ui/select.d.ts.map +1 -0
  148. package/dist/ui/select.js +40 -0
  149. package/dist/ui/select.js.map +1 -0
  150. package/dist/ui/separator.d.ts +5 -0
  151. package/dist/ui/separator.d.ts.map +1 -0
  152. package/dist/ui/separator.js +10 -0
  153. package/dist/ui/separator.js.map +1 -0
  154. package/dist/ui/sheet.d.ts +16 -0
  155. package/dist/ui/sheet.d.ts.map +1 -0
  156. package/dist/ui/sheet.js +43 -0
  157. package/dist/ui/sheet.js.map +1 -0
  158. package/dist/ui/sidebar.d.ts +76 -0
  159. package/dist/ui/sidebar.d.ts.map +1 -0
  160. package/dist/ui/sidebar.js +216 -0
  161. package/dist/ui/sidebar.js.map +1 -0
  162. package/dist/ui/skeleton.d.ts +3 -0
  163. package/dist/ui/skeleton.d.ts.map +1 -0
  164. package/dist/ui/skeleton.js +7 -0
  165. package/dist/ui/skeleton.js.map +1 -0
  166. package/dist/ui/sonner.d.ts +4 -0
  167. package/dist/ui/sonner.d.ts.map +1 -0
  168. package/dist/ui/sonner.js +22 -0
  169. package/dist/ui/sonner.js.map +1 -0
  170. package/dist/ui/spinner.d.ts +3 -0
  171. package/dist/ui/spinner.d.ts.map +1 -0
  172. package/dist/ui/spinner.js +9 -0
  173. package/dist/ui/spinner.js.map +1 -0
  174. package/dist/ui/switch-thumb.d.ts +7 -0
  175. package/dist/ui/switch-thumb.d.ts.map +1 -0
  176. package/dist/ui/switch-thumb.js +7 -0
  177. package/dist/ui/switch-thumb.js.map +1 -0
  178. package/dist/ui/switch.d.ts +7 -0
  179. package/dist/ui/switch.d.ts.map +1 -0
  180. package/dist/ui/switch.js +11 -0
  181. package/dist/ui/switch.js.map +1 -0
  182. package/dist/ui/table.d.ts +11 -0
  183. package/dist/ui/table.d.ts.map +1 -0
  184. package/dist/ui/table.js +30 -0
  185. package/dist/ui/table.js.map +1 -0
  186. package/dist/ui/tabs.d.ts +12 -0
  187. package/dist/ui/tabs.d.ts.map +1 -0
  188. package/dist/ui/tabs.js +31 -0
  189. package/dist/ui/tabs.js.map +1 -0
  190. package/dist/ui/textarea.d.ts +4 -0
  191. package/dist/ui/textarea.d.ts.map +1 -0
  192. package/dist/ui/textarea.js +8 -0
  193. package/dist/ui/textarea.js.map +1 -0
  194. package/dist/ui/tooltip.d.ts +8 -0
  195. package/dist/ui/tooltip.d.ts.map +1 -0
  196. package/dist/ui/tooltip.js +19 -0
  197. package/dist/ui/tooltip.js.map +1 -0
  198. package/package.json +69 -4
  199. package/src/index.ts +50 -0
  200. package/src/lib/utils.ts +9 -0
  201. package/src/messages/en.ts +12 -0
  202. package/src/messages/index.ts +6 -0
  203. package/src/notion/PageFrame.tsx +18 -0
  204. package/src/notion/PageHeader.tsx +62 -0
  205. package/src/notion/PropertyList.tsx +38 -0
  206. package/src/notion/Status.tsx +44 -0
  207. package/src/notion/icon-stroke.ts +2 -0
  208. package/src/notion/palette.ts +5 -0
  209. package/src/sft-bridge.css +47 -0
  210. package/src/tokens.ts +140 -0
  211. package/src/ui/accordion.tsx +65 -0
  212. package/src/ui/alert-dialog.tsx +196 -0
  213. package/src/ui/alert.tsx +74 -0
  214. package/src/ui/avatar.tsx +108 -0
  215. package/src/ui/badge.tsx +63 -0
  216. package/src/ui/breadcrumb.tsx +113 -0
  217. package/src/ui/button-group.tsx +83 -0
  218. package/src/ui/button.tsx +62 -0
  219. package/src/ui/card.tsx +91 -0
  220. package/src/ui/checkbox.tsx +31 -0
  221. package/src/ui/collapsible.tsx +33 -0
  222. package/src/ui/command.tsx +185 -0
  223. package/src/ui/dialog.tsx +162 -0
  224. package/src/ui/dropdown-menu.tsx +256 -0
  225. package/src/ui/empty.tsx +103 -0
  226. package/src/ui/field.tsx +248 -0
  227. package/src/ui/input-group.tsx +170 -0
  228. package/src/ui/input.tsx +20 -0
  229. package/src/ui/item.tsx +193 -0
  230. package/src/ui/kbd.tsx +28 -0
  231. package/src/ui/label.tsx +23 -0
  232. package/src/ui/popover.tsx +88 -0
  233. package/src/ui/progress.tsx +30 -0
  234. package/src/ui/scroll-area.tsx +57 -0
  235. package/src/ui/select.tsx +189 -0
  236. package/src/ui/separator.tsx +27 -0
  237. package/src/ui/sheet.tsx +146 -0
  238. package/src/ui/sidebar.tsx +744 -0
  239. package/src/ui/skeleton.tsx +13 -0
  240. package/src/ui/sonner.tsx +39 -0
  241. package/src/ui/spinner.tsx +16 -0
  242. package/src/ui/switch-thumb.ts +6 -0
  243. package/src/ui/switch.tsx +36 -0
  244. package/src/ui/table.tsx +115 -0
  245. package/src/ui/tabs.tsx +90 -0
  246. package/src/ui/textarea.tsx +17 -0
  247. package/src/ui/tooltip.tsx +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/ui/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAEhD,SAAS,IAAI,CAAC,EACZ,SAAS,EACT,WAAW,GAAG,YAAY,EAC1B,GAAG,KAAK,EACwC;IAChD,OAAO,CACL,KAAC,aAAa,CAAC,IAAI,iBACP,MAAM,sBACE,WAAW,EAC7B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,CACX,8DAA8D,EAC9D,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,GAAG,CAC1B,mRAAmR,EACnR;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,sBAAsB;SAC7B;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,MAAM;KAChB;CACF,CACF,CAAA;AAED,SAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAO,GAAG,MAAM,EAChB,GAAG,KAAK,EAE6B;IACrC,OAAO,CACL,KAAC,aAAa,CAAC,IAAI,iBACP,WAAW,kBACP,OAAO,EACrB,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KACnD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EAC2C;IACnD,OAAO,CACL,KAAC,aAAa,CAAC,OAAO,iBACV,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,gwBAAgwB,EAChwB,uRAAuR,EACvR,2LAA2L,EAC3L,keAAke,EACle,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EAC2C;IACnD,OAAO,CACL,KAAC,aAAa,CAAC,OAAO,iBACV,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAC3C,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
4
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/ui/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,qBAW1E;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ function Textarea({ className, ...props }) {
5
+ return (_jsx("textarea", { "data-slot": "textarea", className: cn("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-field px-2.5 py-1.5 text-base transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:ring-destructive/40", className), ...props }));
6
+ }
7
+ export { Textarea };
8
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/ui/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAoC;IACzE,OAAO,CACL,gCACY,UAAU,EACpB,SAAS,EAAE,EAAE,CACX,iaAAia,EACja,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import { Tooltip as TooltipPrimitive } from "radix-ui";
3
+ declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
4
+ declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
5
+ declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
6
+ declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
7
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
8
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../src/ui/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEtD,iBAAS,eAAe,CAAC,EACvB,aAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,qBAQxD;AAED,iBAAS,OAAO,CAAC,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,qBAEpD;AAED,iBAAS,cAAc,CAAC,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,qBAEvD;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,qBAgBvD;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/utils.js";
5
+ import { Tooltip as TooltipPrimitive } from "radix-ui";
6
+ function TooltipProvider({ delayDuration = 0, ...props }) {
7
+ return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
8
+ }
9
+ function Tooltip({ ...props }) {
10
+ return _jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
11
+ }
12
+ function TooltipTrigger({ ...props }) {
13
+ return _jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
14
+ }
15
+ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
16
+ return (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn("z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-sm bg-tooltip px-2 py-1 text-xs font-medium text-balance text-tooltip-foreground fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", className), ...props, children: children }) }));
17
+ }
18
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
19
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../src/ui/tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEtD,SAAS,eAAe,CAAC,EACvB,aAAa,GAAG,CAAC,EACjB,GAAG,KAAK,EAC+C;IACvD,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,iBACd,kBAAkB,EAC5B,aAAa,EAAE,aAAa,KACxB,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,EACf,GAAG,KAAK,EAC2C;IACnD,OAAO,KAAC,gBAAgB,CAAC,IAAI,iBAAW,SAAS,KAAK,KAAK,GAAI,CAAA;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,GAAG,KAAK,EAC8C;IACtD,OAAO,KAAC,gBAAgB,CAAC,OAAO,iBAAW,iBAAiB,KAAK,KAAK,GAAI,CAAA;AAC5E,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAU,GAAG,CAAC,EACd,QAAQ,EACR,GAAG,KAAK,EAC8C;IACtD,OAAO,CACL,KAAC,gBAAgB,CAAC,MAAM,cACtB,KAAC,gBAAgB,CAAC,OAAO,iBACb,iBAAiB,EAC3B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACX,kbAAkb,EAClb,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACgB,GACH,CAC3B,CAAA;AACH,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,71 @@
1
1
  {
2
2
  "name": "@softure-ai/theme-notion",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "SOFTURE AI Notion theme: shadcn/ui components (new-york v4, Radix, Tailwind CSS v4, lucide) with the Notion design system's tokens and deltas, ready to import.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "*.css"
9
+ ],
10
+ "engines": {
11
+ "node": ">=22"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/SOFTURE/AI.git",
16
+ "directory": "themes/theme-notion"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "CHANGELOG.md",
21
+ "src",
22
+ "!src/**/*.test.ts",
23
+ "!src/**/*.test.tsx"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public",
27
+ "provenance": true
28
+ },
29
+ "exports": {
30
+ ".": {
31
+ "@softure-ai/source": "./src/index.ts",
32
+ "types": "./dist/index.d.ts",
33
+ "default": "./dist/index.js"
34
+ },
35
+ "./theme.css": "./dist/theme.css",
36
+ "./sft-bridge.css": "./dist/sft-bridge.css"
37
+ },
38
+ "softureTheme": {
39
+ "sources": [
40
+ "./ui",
41
+ "./notion"
42
+ ],
43
+ "imports": [
44
+ "tw-animate-css"
45
+ ],
46
+ "stylesheets": [
47
+ "sft-bridge.css"
48
+ ]
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.build.json && softure-theme-css"
52
+ },
53
+ "dependencies": {
54
+ "@softure-ai/theme-kit": "^0.1.0",
55
+ "class-variance-authority": "^0.7.1",
56
+ "cmdk": "^1.1.1",
57
+ "lucide-react": "^1.61.0",
58
+ "radix-ui": "^1.8.1",
59
+ "sonner": "^2.0.8",
60
+ "tw-animate-css": "^1.4.0"
61
+ },
62
+ "peerDependencies": {
63
+ "react": "^19.0.0",
64
+ "react-dom": "^19.0.0",
65
+ "tailwindcss": "^4.0.0"
66
+ },
67
+ "devDependencies": {
68
+ "@softure-ai/ui": "^0.3.4",
69
+ "zod": "^4.6.5"
70
+ }
71
+ }
package/src/index.ts ADDED
@@ -0,0 +1,50 @@
1
+ // The Notion theme: tokens, cn, the shadcn/ui components with the theme's deltas, and the compositions.
2
+ // The stylesheets are separate entries: `@softure-ai/theme-notion/theme.css` and `/sft-bridge.css`.
3
+ export { NOTION_THEME, theme } from "./tokens.js";
4
+ export { cn } from "./lib/utils.js";
5
+ export { notionMessages, type NotionMessages } from "./messages/index.js";
6
+
7
+ export * from "./ui/accordion.js";
8
+ export * from "./ui/alert.js";
9
+ export * from "./ui/alert-dialog.js";
10
+ export * from "./ui/avatar.js";
11
+ export * from "./ui/badge.js";
12
+ export * from "./ui/breadcrumb.js";
13
+ export * from "./ui/button.js";
14
+ export * from "./ui/button-group.js";
15
+ export * from "./ui/card.js";
16
+ export * from "./ui/checkbox.js";
17
+ export * from "./ui/collapsible.js";
18
+ export * from "./ui/command.js";
19
+ export * from "./ui/dialog.js";
20
+ export * from "./ui/dropdown-menu.js";
21
+ export * from "./ui/empty.js";
22
+ export * from "./ui/field.js";
23
+ export * from "./ui/input.js";
24
+ export * from "./ui/input-group.js";
25
+ export * from "./ui/item.js";
26
+ export * from "./ui/kbd.js";
27
+ export * from "./ui/label.js";
28
+ export * from "./ui/popover.js";
29
+ export * from "./ui/progress.js";
30
+ export * from "./ui/scroll-area.js";
31
+ export * from "./ui/select.js";
32
+ export * from "./ui/separator.js";
33
+ export * from "./ui/sheet.js";
34
+ export * from "./ui/sidebar.js";
35
+ export * from "./ui/skeleton.js";
36
+ export * from "./ui/sonner.js";
37
+ export * from "./ui/spinner.js";
38
+ export * from "./ui/switch.js";
39
+ export { SWITCH_THUMB_SHADOW_CLASS } from "./ui/switch-thumb.js";
40
+ export * from "./ui/table.js";
41
+ export * from "./ui/tabs.js";
42
+ export * from "./ui/textarea.js";
43
+ export * from "./ui/tooltip.js";
44
+
45
+ export { ICON_STROKE_WIDTH } from "./notion/icon-stroke.js";
46
+ export { PALETTE_COLORS, type PaletteColor } from "./notion/palette.js";
47
+ export { PageFrame, type PageFrameProps } from "./notion/PageFrame.js";
48
+ export { PageHeader, type PageCrumb, type PageHeaderProps } from "./notion/PageHeader.js";
49
+ export { PropertyList, type Property, type PropertyListProps } from "./notion/PropertyList.js";
50
+ export { Status, type StatusProps } from "./notion/Status.js";
@@ -0,0 +1,9 @@
1
+ import { createThemeCn } from "@softure-ai/theme-kit";
2
+
3
+ import { NOTION_THEME } from "../tokens.js";
4
+
5
+ /**
6
+ * shadcn/ui's `cn` for the Notion theme: a later Tailwind utility wins over an earlier one of the same kind, and the
7
+ * theme's named text styles (`text-body`) and shadows (`shadow-menu`) merge as their own kinds.
8
+ */
9
+ export const cn = createThemeCn(NOTION_THEME);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The built-in English copy of the components: accessible names a screen reader announces. Every text has a prop to
3
+ * replace it with the app's own wording from its message layer.
4
+ */
5
+ export const en = {
6
+ breadcrumb: { label: "breadcrumb", more: "More" },
7
+ dialog: { close: "Close" },
8
+ sheet: { close: "Close" },
9
+ sidebar: { mobileTitle: "Sidebar", mobileDescription: "Displays the mobile sidebar.", toggle: "Toggle Sidebar" },
10
+ spinner: { label: "Loading" },
11
+ command: { title: "Command Palette", description: "Search for a command to run..." },
12
+ } as const;
@@ -0,0 +1,6 @@
1
+ import { en } from "./en.js";
2
+
3
+ /** The built-in English dictionary; replace a text through the component's prop (README, "Copy"). */
4
+ export const notionMessages = { en };
5
+
6
+ export type NotionMessages = typeof en;
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ export interface PageFrameProps {
4
+ children: ReactNode;
5
+ }
6
+
7
+ /**
8
+ * A page outside the app shell (the sign-in and account pages of the packages, the not-found page): the window's
9
+ * height on the Notion background, with the package's `--sft-*` tokens re-pointed at the Notion theme
10
+ * (`src/app/sft-bridge.css`). No `data-slot`: the scoped preflight stays off the package pages.
11
+ */
12
+ export function PageFrame({ children }: PageFrameProps) {
13
+ return (
14
+ <div data-page-frame="" className="min-h-dvh bg-background font-sans text-ui text-foreground">
15
+ {children}
16
+ </div>
17
+ );
18
+ }
@@ -0,0 +1,62 @@
1
+ import { Fragment, type ReactNode } from "react";
2
+
3
+ import {
4
+ Breadcrumb,
5
+ BreadcrumbItem,
6
+ BreadcrumbLink,
7
+ BreadcrumbList,
8
+ BreadcrumbPage,
9
+ BreadcrumbSeparator,
10
+ } from "../ui/breadcrumb.js";
11
+ import { cn } from "../lib/utils.js";
12
+
13
+ export interface PageCrumb {
14
+ label: string;
15
+ // Absent on the current page, the last crumb.
16
+ href?: string;
17
+ }
18
+
19
+ export interface PageHeaderProps {
20
+ title: ReactNode;
21
+ crumbs?: PageCrumb[];
22
+ // A lucide icon, never an emoji.
23
+ icon?: ReactNode;
24
+ description?: ReactNode;
25
+ actions?: ReactNode;
26
+ // Content right under the title, before the description (a status line, a picker).
27
+ children?: ReactNode;
28
+ className?: string;
29
+ }
30
+
31
+ // The page's header, once per screen: breadcrumb, page icon, the 40 px title, what follows it, a description and actions.
32
+ export function PageHeader({ title, crumbs, icon, description, actions, children, className }: PageHeaderProps) {
33
+ return (
34
+ <header data-slot="page-header" className={cn("flex flex-col", className)}>
35
+ {crumbs && crumbs.length > 0 ? (
36
+ <Breadcrumb>
37
+ <BreadcrumbList>
38
+ {crumbs.map((crumb, index) => (
39
+ <Fragment key={`${index}-${crumb.label}`}>
40
+ {index > 0 ? <BreadcrumbSeparator /> : null}
41
+ <BreadcrumbItem>
42
+ {crumb.href === undefined ? (
43
+ <BreadcrumbPage>{crumb.label}</BreadcrumbPage>
44
+ ) : (
45
+ <BreadcrumbLink href={crumb.href}>{crumb.label}</BreadcrumbLink>
46
+ )}
47
+ </BreadcrumbItem>
48
+ </Fragment>
49
+ ))}
50
+ </BreadcrumbList>
51
+ </Breadcrumb>
52
+ ) : null}
53
+ {icon ? (
54
+ <div className="mt-6 mb-2 flex size-14 items-center justify-center rounded-xl bg-secondary [&>svg]:size-8">{icon}</div>
55
+ ) : null}
56
+ <h1 className="text-page-title text-balance">{title}</h1>
57
+ {children}
58
+ {description ? <p className="mt-1 text-body text-muted-foreground">{description}</p> : null}
59
+ {actions ? <div className="mt-3 flex flex-wrap gap-1">{actions}</div> : null}
60
+ </header>
61
+ );
62
+ }
@@ -0,0 +1,38 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ import { Field, FieldGroup, FieldLabel } from "../ui/field.js";
4
+ import { cn } from "../lib/utils.js";
5
+
6
+ export interface Property {
7
+ label: string;
8
+ value: ReactNode;
9
+ icon?: ReactNode;
10
+ }
11
+
12
+ export interface PropertyListProps {
13
+ items: Property[];
14
+ className?: string;
15
+ }
16
+
17
+ // Properties as in a Notion database page: a 160 px label with its type icon, then the value.
18
+ export function PropertyList({ items, className }: PropertyListProps) {
19
+ return (
20
+ <FieldGroup data-slot="property-list" className={cn("gap-0.5", className)}>
21
+ {items.map((item) => (
22
+ <Field
23
+ key={item.label}
24
+ orientation="horizontal"
25
+ className="min-h-row-height items-center gap-0 [&>[data-slot=field-label]]:flex-none"
26
+ >
27
+ <FieldLabel className="w-40 flex-none gap-1.5 px-1.5 font-normal text-muted-foreground [&>svg]:size-4">
28
+ {item.icon}
29
+ {item.label}
30
+ </FieldLabel>
31
+ <div className="flex min-h-row-height min-w-0 flex-1 flex-wrap items-center gap-1 rounded-xs px-2 hover:bg-accent">
32
+ {item.value}
33
+ </div>
34
+ </Field>
35
+ ))}
36
+ </FieldGroup>
37
+ );
38
+ }
@@ -0,0 +1,44 @@
1
+ import type { LucideIcon } from "lucide-react";
2
+ import type { ReactNode } from "react";
3
+
4
+ import { Badge } from "../ui/badge.js";
5
+ import { cn } from "../lib/utils.js";
6
+
7
+ import { ICON_STROKE_WIDTH } from "./icon-stroke.js";
8
+ import type { PaletteColor } from "./palette.js";
9
+
10
+ // Literal class names, so Tailwind generates each one.
11
+ const TEXT_COLOR: Record<PaletteColor, string> = {
12
+ gray: "text-gray",
13
+ brown: "text-brown",
14
+ orange: "text-orange",
15
+ yellow: "text-yellow",
16
+ green: "text-green",
17
+ blue: "text-blue",
18
+ purple: "text-purple",
19
+ pink: "text-pink",
20
+ red: "text-red",
21
+ };
22
+
23
+ export interface StatusProps {
24
+ color: PaletteColor;
25
+ icon: LucideIcon;
26
+ // The word: a status always carries one, so states read apart without telling colours apart.
27
+ children: ReactNode;
28
+ className?: string;
29
+ }
30
+
31
+ // A state of something (booked, to pay, overdue): a ghost badge with a line icon and a word in a palette colour.
32
+ export function Status({ color, icon: Icon, children, className }: StatusProps) {
33
+ return (
34
+ <Badge
35
+ variant="ghost"
36
+ data-slot="status"
37
+ data-color={color}
38
+ className={cn("gap-1.5 px-0 text-sm font-normal [&>svg]:size-4", TEXT_COLOR[color], className)}
39
+ >
40
+ <Icon aria-hidden="true" strokeWidth={ICON_STROKE_WIDTH} />
41
+ {children}
42
+ </Badge>
43
+ );
44
+ }
@@ -0,0 +1,2 @@
1
+ // The design system's icon line: lucide icons at 1.75 instead of lucide's default 2 (docs/design-system.md, "Icons").
2
+ export const ICON_STROKE_WIDTH = 1.75;
@@ -0,0 +1,5 @@
1
+ // The design system's nine palette colours. A colour marks an area (a tag) or a state (a status, a callout), never
2
+ // decoration, and always means the same thing; each app keeps its own table of which meaning takes which colour.
3
+ export const PALETTE_COLORS = ["gray", "brown", "orange", "yellow", "green", "blue", "purple", "pink", "red"] as const;
4
+
5
+ export type PaletteColor = (typeof PALETTE_COLORS)[number];
@@ -0,0 +1,47 @@
1
+ /*
2
+ * The bridge from the `--sft-*` tokens of @softure-ai/ui to the Notion theme. Pages rendered by the SOFTURE packages
3
+ * (sign-in, password, MCP access, OAuth consent) read `--sft-*`; inside a `PageFrame` (any `[data-page-frame]`
4
+ * element) those tokens point at the Notion values, so the package pages take the theme's colours, type, radii and
5
+ * shadows. Scoped to the frame, not `:root`: screens still on `--sft-*` keep their look until they move. The Notion
6
+ * colours and shadows switch scheme by themselves, so the bridge needs no dark block. Spacing, text sizes and
7
+ * durations stay the package's: the scales already match, and the theme has no motion tokens.
8
+ *
9
+ * Import it after `theme.css`, through the app's Tailwind (it reads the theme with `--theme()`).
10
+ */
11
+ @layer base {
12
+ [data-page-frame] {
13
+ --sft-font-sans: --theme(--font-sans);
14
+ --sft-font-heading: --theme(--font-sans);
15
+ --sft-font-mono: --theme(--font-mono);
16
+
17
+ --sft-radius-control: --theme(--radius-md);
18
+ --sft-radius-card: --theme(--radius-lg);
19
+ --sft-radius-pill: --theme(--radius-full);
20
+
21
+ --sft-color-background: var(--background);
22
+ --sft-color-surface: var(--card);
23
+ --sft-color-surface-raised: var(--popover);
24
+ --sft-color-foreground: var(--foreground);
25
+ --sft-color-muted: var(--muted-foreground);
26
+ --sft-color-border: var(--border);
27
+ --sft-color-border-strong: var(--control-off);
28
+ --sft-color-accent: var(--primary);
29
+ --sft-color-accent-fill: var(--primary);
30
+ --sft-color-accent-fill-hover: var(--primary-hover);
31
+ --sft-color-on-accent: var(--primary-foreground);
32
+ --sft-color-danger: var(--red);
33
+ --sft-color-success: var(--green);
34
+ --sft-color-warning: var(--orange);
35
+ --sft-color-focus: var(--ring);
36
+ --sft-color-overlay: var(--overlay);
37
+
38
+ --sft-shadow-1: var(--shadow-card);
39
+ --sft-shadow-2: var(--shadow-dialog);
40
+ }
41
+
42
+ /* A page in a frame fills the window: no browser margin, the Notion background behind everything. */
43
+ body:has([data-page-frame]) {
44
+ margin: 0;
45
+ background-color: var(--background);
46
+ }
47
+ }
package/src/tokens.ts ADDED
@@ -0,0 +1,140 @@
1
+ import { defineTheme } from "@softure-ai/theme-kit";
2
+
3
+ /**
4
+ * The Notion theme: the token values of the Notion design system (shadcn/ui new-york v4 with Notion's colours, type,
5
+ * radii and shadows). `tests/tokens.test.ts` keeps them equal to the design system's token snapshot
6
+ * (`tests/fixtures/notion-tokens.json`); the kit's `softure-theme-css` turns them into `theme.css`.
7
+ */
8
+ export const NOTION_THEME = defineTheme({
9
+ name: "Notion",
10
+ colors: {
11
+ background: { light: "#ffffff", dark: "#191919" },
12
+ foreground: { light: "#37352f", dark: "#d4d4d4" },
13
+ card: { light: "#ffffff", dark: "#202020" },
14
+ "card-foreground": { light: "#37352f", dark: "#d4d4d4" },
15
+ popover: { light: "#ffffff", dark: "#252525" },
16
+ "popover-foreground": { light: "#37352f", dark: "#d4d4d4" },
17
+ primary: { light: "#2383e2", dark: "#2383e2" },
18
+ "primary-foreground": { light: "#ffffff", dark: "#ffffff" },
19
+ "primary-hover": { light: "#0077d4", dark: "#0077d4" },
20
+ secondary: { light: "#f1f1ef", dark: "#2f2f2f" },
21
+ "secondary-foreground": { light: "#37352f", dark: "#d4d4d4" },
22
+ muted: { light: "#f7f7f5", dark: "#202020" },
23
+ "muted-foreground": { light: "#787774", dark: "#9b9b9b" },
24
+ accent: { light: "rgba(55, 53, 47, 0.08)", dark: "rgba(255, 255, 255, 0.055)" },
25
+ "accent-foreground": { light: "#37352f", dark: "#d4d4d4" },
26
+ "accent-strong": { light: "rgba(55, 53, 47, 0.16)", dark: "rgba(255, 255, 255, 0.1)" },
27
+ destructive: { light: "#eb5757", dark: "#eb5757" },
28
+ "destructive-foreground": { light: "#ffffff", dark: "#ffffff" },
29
+ border: { light: "#e9e9e7", dark: "#2f2f2f" },
30
+ input: { light: "rgba(15, 15, 15, 0.1)", dark: "rgba(255, 255, 255, 0.075)" },
31
+ field: { light: "rgba(242, 241, 238, 0.6)", dark: "rgba(255, 255, 255, 0.055)" },
32
+ "control-off": { light: "rgba(135, 131, 120, 0.3)", dark: "rgba(202, 196, 183, 0.15)" },
33
+ ring: { light: "rgba(35, 131, 226, 0.57)", dark: "rgba(35, 131, 226, 0.57)" },
34
+ sidebar: { light: "#f7f7f5", dark: "#202020" },
35
+ "sidebar-foreground": { light: "#5f5e5b", dark: "#9b9b9b" },
36
+ "sidebar-primary": { light: "#2383e2", dark: "#2383e2" },
37
+ "sidebar-primary-foreground": { light: "#ffffff", dark: "#ffffff" },
38
+ "sidebar-accent": { light: "rgba(55, 53, 47, 0.08)", dark: "rgba(255, 255, 255, 0.055)" },
39
+ "sidebar-accent-foreground": { light: "#37352f", dark: "#d4d4d4" },
40
+ "sidebar-border": { light: "#ededeb", dark: "#2a2a2a" },
41
+ "sidebar-ring": { light: "rgba(35, 131, 226, 0.57)", dark: "rgba(35, 131, 226, 0.57)" },
42
+ tooltip: { light: "#0f0f0f", dark: "#373737" },
43
+ "tooltip-foreground": { light: "rgba(255, 255, 255, 0.9)", dark: "rgba(255, 255, 255, 0.9)" },
44
+ overlay: { light: "rgba(15, 15, 15, 0.6)", dark: "rgba(0, 0, 0, 0.6)" },
45
+ gray: { light: "#787774", dark: "#9b9b9b" },
46
+ "gray-bg": { light: "#f1f1ef", dark: "#2f2f2f" },
47
+ "gray-tag": { light: "#e3e2e0", dark: "#5a5a5a" },
48
+ "gray-tag-foreground": { light: "#32302c", dark: "rgba(255, 255, 255, 0.81)" },
49
+ brown: { light: "#9f6b53", dark: "#ba856f" },
50
+ "brown-bg": { light: "#f4eeee", dark: "#4a3228" },
51
+ "brown-tag": { light: "#eee0da", dark: "#603b2c" },
52
+ "brown-tag-foreground": { light: "#442a1e", dark: "rgba(255, 255, 255, 0.81)" },
53
+ orange: { light: "#d9730d", dark: "#c77d48" },
54
+ "orange-bg": { light: "#fbecdd", dark: "#5c3b23" },
55
+ "orange-tag": { light: "#fadec9", dark: "#854c1d" },
56
+ "orange-tag-foreground": { light: "#49290e", dark: "rgba(255, 255, 255, 0.81)" },
57
+ yellow: { light: "#cb912f", dark: "#ca984d" },
58
+ "yellow-bg": { light: "#fbf3db", dark: "#564328" },
59
+ "yellow-tag": { light: "#fdecc8", dark: "#89632a" },
60
+ "yellow-tag-foreground": { light: "#402c1b", dark: "rgba(255, 255, 255, 0.81)" },
61
+ green: { light: "#448361", dark: "#529e72" },
62
+ "green-bg": { light: "#edf3ec", dark: "#243d30" },
63
+ "green-tag": { light: "#dbeddb", dark: "#2b593f" },
64
+ "green-tag-foreground": { light: "#1c3829", dark: "rgba(255, 255, 255, 0.81)" },
65
+ blue: { light: "#337ea9", dark: "#379ad3" },
66
+ "blue-bg": { light: "#e7f3f8", dark: "#143a4e" },
67
+ "blue-tag": { light: "#d3e5ef", dark: "#28456c" },
68
+ "blue-tag-foreground": { light: "#183347", dark: "rgba(255, 255, 255, 0.81)" },
69
+ purple: { light: "#9065b0", dark: "#9d68d3" },
70
+ "purple-bg": { light: "#f6f3f9", dark: "#3c2d49" },
71
+ "purple-tag": { light: "#e8deee", dark: "#492f64" },
72
+ "purple-tag-foreground": { light: "#412454", dark: "rgba(255, 255, 255, 0.81)" },
73
+ pink: { light: "#c14c8a", dark: "#d15796" },
74
+ "pink-bg": { light: "#faf1f5", dark: "#4e2c3c" },
75
+ "pink-tag": { light: "#f5e0e9", dark: "#69314c" },
76
+ "pink-tag-foreground": { light: "#4c2337", dark: "rgba(255, 255, 255, 0.81)" },
77
+ red: { light: "#d44c47", dark: "#df5452" },
78
+ "red-bg": { light: "#fdebec", dark: "#522e2a" },
79
+ "red-tag": { light: "#ffe2dd", dark: "#6e3630" },
80
+ "red-tag-foreground": { light: "#5d1715", dark: "rgba(255, 255, 255, 0.81)" },
81
+ "default-tag": { light: "#f1f0ef", dark: "#373737" },
82
+ "default-tag-foreground": { light: "#32302c", dark: "#d4d4d4" },
83
+ "chart-1": { alias: "blue" },
84
+ "chart-2": { alias: "orange" },
85
+ "chart-3": { alias: "green" },
86
+ "chart-4": { alias: "purple" },
87
+ "chart-5": { alias: "pink" },
88
+ },
89
+ shadows: {
90
+ menu: {
91
+ light: "0 0 0 1px rgba(15, 15, 15, 0.05), 0 3px 6px rgba(15, 15, 15, 0.1), 0 9px 24px rgba(15, 15, 15, 0.2)",
92
+ dark: "0 0 0 1px rgba(255, 255, 255, 0.094), 0 3px 6px rgba(0, 0, 0, 0.2), 0 9px 24px rgba(0, 0, 0, 0.4)",
93
+ },
94
+ dialog: {
95
+ light: "0 0 0 1px rgba(15, 15, 15, 0.05), 0 5px 10px rgba(15, 15, 15, 0.1), 0 15px 40px rgba(15, 15, 15, 0.2)",
96
+ dark: "0 0 0 1px rgba(255, 255, 255, 0.094), 0 5px 10px rgba(0, 0, 0, 0.3), 0 15px 40px rgba(0, 0, 0, 0.5)",
97
+ },
98
+ card: {
99
+ light: "0 0 0 1px rgba(15, 15, 15, 0.1), 0 2px 4px rgba(15, 15, 15, 0.1)",
100
+ dark: "0 0 0 1px rgba(255, 255, 255, 0.094), 0 2px 4px rgba(0, 0, 0, 0.3)",
101
+ },
102
+ },
103
+ fonts: {
104
+ sans: "ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable Display\", \"Segoe UI\", Helvetica, Arial, sans-serif",
105
+ mono: "ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace",
106
+ serif: "ui-serif, Georgia, Cambria, \"Times New Roman\", serif",
107
+ },
108
+ textStyles: {
109
+ "page-title": { fontSize: "40px", lineHeight: "48px", fontWeight: 700, letterSpacing: "-0.01em" },
110
+ "heading-1": { fontSize: "30px", lineHeight: "39px", fontWeight: 600 },
111
+ "heading-2": { fontSize: "24px", lineHeight: "31px", fontWeight: 600 },
112
+ "heading-3": { fontSize: "20px", lineHeight: "26px", fontWeight: 600 },
113
+ body: { fontSize: "16px", lineHeight: "24px", fontWeight: 400 },
114
+ ui: { fontSize: "14px", lineHeight: "20px", fontWeight: 400 },
115
+ "ui-medium": { fontSize: "14px", lineHeight: "20px", fontWeight: 500 },
116
+ small: { fontSize: "12px", lineHeight: "16px", fontWeight: 400 },
117
+ "section-label": { fontSize: "12px", lineHeight: "16px", fontWeight: 500, letterSpacing: "0.01em" },
118
+ code: { fontSize: "13px", lineHeight: "20px", fontWeight: 400 },
119
+ },
120
+ radii: {
121
+ xs: "3px",
122
+ sm: "4px",
123
+ md: "6px",
124
+ lg: "8px",
125
+ xl: "10px",
126
+ full: "9999px",
127
+ },
128
+ sizes: {
129
+ "sidebar-width": "240px",
130
+ "content-width": "708px",
131
+ "content-width-wide": "1152px",
132
+ "control-height": "28px",
133
+ "row-height": "34px",
134
+ },
135
+ // The design system allows only its own colours, so no raw Tailwind colour utility exists.
136
+ clearDefaultPalette: true,
137
+ });
138
+
139
+ /** The theme under the name every theme package exports, so an app swaps themes by the import path alone. */
140
+ export const theme = NOTION_THEME;