@dhasdk/simple-ui 1.0.7 → 1.0.8

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 (227) hide show
  1. package/.babelrc +12 -0
  2. package/.storybook/main.ts +35 -0
  3. package/.storybook/preview.ts +4 -0
  4. package/BAKpostcss.config.jsBAK +15 -0
  5. package/BAKtailwind.config.mjsBAK +99 -0
  6. package/README.md +464 -16
  7. package/coverage/storybook/coverage-storybook.json +32411 -0
  8. package/coverage/storybook/lcov-report/Accordion.tsx.html +805 -0
  9. package/coverage/storybook/lcov-report/Badge.tsx.html +346 -0
  10. package/coverage/storybook/lcov-report/Breadcrumbs.tsx.html +742 -0
  11. package/coverage/storybook/lcov-report/Button.tsx.html +448 -0
  12. package/coverage/storybook/lcov-report/ButtonGroup.tsx.html +403 -0
  13. package/coverage/storybook/lcov-report/Card.tsx.html +292 -0
  14. package/coverage/storybook/lcov-report/CharacterCounter.tsx.html +253 -0
  15. package/coverage/storybook/lcov-report/CheckBox.tsx.html +1555 -0
  16. package/coverage/storybook/lcov-report/DatePicker.tsx.html +826 -0
  17. package/coverage/storybook/lcov-report/Input.tsx.html +1012 -0
  18. package/coverage/storybook/lcov-report/List.tsx.html +364 -0
  19. package/coverage/storybook/lcov-report/Modal.tsx.html +745 -0
  20. package/coverage/storybook/lcov-report/Pill.tsx.html +358 -0
  21. package/coverage/storybook/lcov-report/Search.tsx.html +997 -0
  22. package/coverage/storybook/lcov-report/SearchContent.tsx.html +235 -0
  23. package/coverage/storybook/lcov-report/SectionHeader.tsx.html +358 -0
  24. package/coverage/storybook/lcov-report/Select.tsx.html +1012 -0
  25. package/coverage/storybook/lcov-report/Shield.tsx.html +802 -0
  26. package/coverage/storybook/lcov-report/SideBarNav.tsx.html +490 -0
  27. package/coverage/storybook/lcov-report/Skeleton.tsx.html +394 -0
  28. package/coverage/storybook/lcov-report/Slider.tsx.html +385 -0
  29. package/coverage/storybook/lcov-report/Status.tsx.html +322 -0
  30. package/coverage/storybook/lcov-report/Tabs.tsx.html +610 -0
  31. package/coverage/storybook/lcov-report/Toggle.tsx.html +373 -0
  32. package/coverage/storybook/lcov-report/Tooltip.tsx.html +496 -0
  33. package/coverage/storybook/lcov-report/base.css +224 -0
  34. package/coverage/storybook/lcov-report/block-navigation.js +87 -0
  35. package/coverage/storybook/lcov-report/favicon.png +0 -0
  36. package/coverage/storybook/lcov-report/index.html +476 -0
  37. package/coverage/storybook/lcov-report/prettify.css +1 -0
  38. package/coverage/storybook/lcov-report/prettify.js +2 -0
  39. package/coverage/storybook/lcov-report/sort-arrow-sprite.png +0 -0
  40. package/coverage/storybook/lcov-report/sorter.js +196 -0
  41. package/coverage/storybook/lcov.info +2312 -0
  42. package/dist/README.md +1815 -0
  43. package/eslint.config.mjs +13 -0
  44. package/package.json +6 -7
  45. package/project.json +11 -0
  46. package/src/assets/img/Frame.svg +5 -0
  47. package/src/assets/img/backArrowRight.svg +10 -0
  48. package/src/assets/img/bc-separator.png +0 -0
  49. package/src/assets/img/calendar.png +0 -0
  50. package/src/assets/img/calendar.svg +4 -0
  51. package/src/assets/img/check.svg +5 -0
  52. package/src/assets/img/check_box.svg +10 -0
  53. package/src/assets/img/check_box_empty.svg +10 -0
  54. package/src/assets/img/check_box_fill.svg +10 -0
  55. package/src/assets/img/check_box_fill_empty.svg +10 -0
  56. package/src/assets/img/chevron-down-white.svg +2 -0
  57. package/src/assets/img/chevron-down.svg +2 -0
  58. package/src/assets/img/chevron-left.svg +1 -0
  59. package/src/assets/img/chevron-right-light.svg +4 -0
  60. package/src/assets/img/chevron-right.svg +3 -0
  61. package/src/assets/img/chevron-up-white.svg +1 -0
  62. package/src/assets/img/chevron-up.svg +1 -0
  63. package/src/assets/img/clock.svg +6 -0
  64. package/src/assets/img/close.svg +1 -0
  65. package/src/assets/img/close2.svg +6 -0
  66. package/src/assets/img/closeModal.svg +10 -0
  67. package/src/assets/img/close_icon_dark.svg +10 -0
  68. package/src/assets/img/close_small.svg +3 -0
  69. package/src/assets/img/emergency_home.svg +10 -0
  70. package/src/assets/img/first-aid-kit.svg +7 -0
  71. package/src/assets/img/heartbeat.svg +4 -0
  72. package/src/assets/img/home-gray.svg +3 -0
  73. package/src/assets/img/home.svg +3 -0
  74. package/src/assets/img/hospital.jpg +0 -0
  75. package/src/assets/img/indeterminate_check_box.svg +10 -0
  76. package/src/assets/img/indeterminate_check_box_fill.svg +10 -0
  77. package/src/assets/img/info_24_ 1d4ed8.svg +3 -0
  78. package/src/assets/img/info_24_ 2c6441.svg +3 -0
  79. package/src/assets/img/marker_check_by_default.svg +10 -0
  80. package/src/assets/img/marker_check_by_default_fill.svg +10 -0
  81. package/src/assets/img/minus-accordion.svg +5 -0
  82. package/src/assets/img/minus.svg +3 -0
  83. package/src/assets/img/open.svg +1 -0
  84. package/src/assets/img/pill-white.svg +7 -0
  85. package/src/assets/img/pill.svg +5 -0
  86. package/src/assets/img/plus-accordion.svg +5 -0
  87. package/src/assets/img/plus.svg +4 -0
  88. package/src/assets/img/prescription.svg +6 -0
  89. package/src/assets/img/search.svg +10 -0
  90. package/src/assets/img/search_icon_light.svg +10 -0
  91. package/src/assets/img/separator.svg +3 -0
  92. package/src/assets/img/stethoscope-white.svg +8 -0
  93. package/src/assets/img/stethoscope.svg +8 -0
  94. package/src/assets/img/thumb_up.svg +10 -0
  95. package/src/assets/img/vector.svg +3 -0
  96. package/src/assets/img/warning-badge-disabled.svg +11 -0
  97. package/src/assets/img/warning-badge-green.svg +11 -0
  98. package/src/assets/img/warning-badge-red.svg +11 -0
  99. package/src/assets/img/warning-badge-yellow.svg +11 -0
  100. package/src/assets/img/warning.svg +10 -0
  101. package/src/global.d.ts +13 -0
  102. package/{index.d.ts → src/index.ts} +13 -5
  103. package/src/lib/Accordian--Accordian.stories.tsx +312 -0
  104. package/src/lib/Accordion.spec.tsx +384 -0
  105. package/src/lib/Accordion.tsx +240 -0
  106. package/src/lib/AppointmentPicker.spec.tsx +138 -0
  107. package/src/lib/AppointmentPicker.tsx +97 -0
  108. package/src/lib/Badge--Badge.stories.tsx +60 -0
  109. package/src/lib/Badge.spec.tsx +70 -0
  110. package/src/lib/Badge.tsx +87 -0
  111. package/src/lib/Breadcrumbs-Breadcrumbs.stories.tsx +114 -0
  112. package/src/lib/Breadcrumbs.spec.tsx +218 -0
  113. package/src/lib/Breadcrumbs.tsx +219 -0
  114. package/src/lib/Button--Button.stories.tsx +220 -0
  115. package/src/lib/Button.spec.tsx +241 -0
  116. package/src/lib/Button.tsx +121 -0
  117. package/src/lib/ButtonGroup--ButtonGroup.stories.tsx +129 -0
  118. package/src/lib/ButtonGroup.spec.tsx +89 -0
  119. package/src/lib/ButtonGroup.tsx +107 -0
  120. package/src/lib/Card--Card.stories.tsx +113 -0
  121. package/src/lib/Card.spec.tsx +112 -0
  122. package/src/lib/Card.tsx +69 -0
  123. package/src/lib/CharacterCounter--CharacterCounter.stories.tsx +169 -0
  124. package/src/lib/CharacterCounter.spec.tsx +123 -0
  125. package/src/lib/CharacterCounter.tsx +56 -0
  126. package/src/lib/CheckBox--CheckBox.stories.tsx +107 -0
  127. package/src/lib/CheckBox.spec.tsx +412 -0
  128. package/src/lib/CheckBox.tsx +491 -0
  129. package/src/lib/DatePicker--DatePicker.stories.tsx +228 -0
  130. package/src/lib/DatePicker.spec.tsx +424 -0
  131. package/src/lib/DatePicker.tsx +247 -0
  132. package/src/lib/Input--Input.stories.tsx +449 -0
  133. package/src/lib/Input.spec.tsx +281 -0
  134. package/src/lib/Input.tsx +309 -0
  135. package/src/lib/List--List.stories.tsx +157 -0
  136. package/src/lib/List.spec.tsx +211 -0
  137. package/src/lib/List.tsx +93 -0
  138. package/src/lib/Modal--Modal.stories.tsx +454 -0
  139. package/src/lib/Modal.spec.tsx +202 -0
  140. package/src/lib/Modal.tsx +220 -0
  141. package/src/lib/Pill--Pill.stories.tsx +98 -0
  142. package/src/lib/Pill.spec.tsx +103 -0
  143. package/src/lib/Pill.tsx +91 -0
  144. package/src/lib/ProgressBar.spec.tsx +106 -0
  145. package/src/lib/ProgressBar.tsx +112 -0
  146. package/src/lib/RadioGroup.spec.tsx +84 -0
  147. package/src/lib/RadioGroup.tsx +74 -0
  148. package/src/lib/RadioIcon.tsx +13 -0
  149. package/src/lib/Search--Search.stories.tsx +67 -0
  150. package/src/lib/Search.spec.tsx +182 -0
  151. package/src/lib/Search.tsx +304 -0
  152. package/src/lib/SearchContent.tsx +51 -0
  153. package/src/lib/SectionHeader--SectionHeader.stories.tsx +98 -0
  154. package/src/lib/SectionHeader.spec.tsx +60 -0
  155. package/src/lib/SectionHeader.tsx +91 -0
  156. package/src/lib/Select--Select.stories.tsx +387 -0
  157. package/src/lib/Select.spec.tsx +493 -0
  158. package/src/lib/Select.tsx +311 -0
  159. package/src/lib/Shield--Shield.stories.tsx +196 -0
  160. package/src/lib/Shield.spec.tsx +275 -0
  161. package/src/lib/Shield.tsx +239 -0
  162. package/src/lib/SideBarNav--SideBarNav.stories.tsx +136 -0
  163. package/src/lib/SideBarNav.spec.tsx +178 -0
  164. package/src/lib/SideBarNav.tsx +135 -0
  165. package/src/lib/Skeleton--Skeleton.stories.tsx +77 -0
  166. package/src/lib/Skeleton.module.css +16 -0
  167. package/src/lib/Skeleton.spec.tsx +83 -0
  168. package/src/lib/Skeleton.tsx +103 -0
  169. package/src/lib/SkipLink.spec.tsx +76 -0
  170. package/src/lib/SkipLink.tsx +48 -0
  171. package/src/lib/Slider--Slider.stories.tsx +108 -0
  172. package/src/lib/Slider.module.css +109 -0
  173. package/src/lib/Slider.spec.tsx +67 -0
  174. package/src/lib/Slider.tsx +101 -0
  175. package/src/lib/Status--Status.stories.tsx +93 -0
  176. package/src/lib/Status.spec.tsx +118 -0
  177. package/src/lib/Status.tsx +79 -0
  178. package/src/lib/Tabs--Tabs.stories.tsx +294 -0
  179. package/src/lib/Tabs.spec.tsx +249 -0
  180. package/src/lib/Tabs.tsx +188 -0
  181. package/src/lib/Tester.spec.tsx +17 -0
  182. package/src/lib/Toggle--Toggle.stories.tsx +162 -0
  183. package/src/lib/Toggle.spec.tsx +122 -0
  184. package/src/lib/Toggle.tsx +96 -0
  185. package/src/lib/Tooltip--Tooltip.stories.tsx +315 -0
  186. package/src/lib/Tooltip.spec.tsx +307 -0
  187. package/src/lib/Tooltip.tsx +137 -0
  188. package/src/lib/bak-simple-ui.stories.tsx-bak +24 -0
  189. package/src/styles.css +190 -0
  190. package/tsconfig.json +25 -0
  191. package/tsconfig.lib.json +42 -0
  192. package/tsconfig.spec.json +29 -0
  193. package/tsconfig.storybook.json +36 -0
  194. package/vite.config.mts +87 -0
  195. package/vitest.setup.ts +12 -0
  196. package/index.css +0 -1
  197. package/index.js +0 -35
  198. package/index.mjs +0 -4981
  199. package/lib/Accordion.d.ts +0 -36
  200. package/lib/AppointmentPicker.d.ts +0 -21
  201. package/lib/Badge.d.ts +0 -11
  202. package/lib/Breadcrumbs.d.ts +0 -13
  203. package/lib/Button.d.ts +0 -15
  204. package/lib/ButtonGroup.d.ts +0 -8
  205. package/lib/Card.d.ts +0 -11
  206. package/lib/CharacterCounter.d.ts +0 -11
  207. package/lib/CheckBox.d.ts +0 -30
  208. package/lib/DatePicker.d.ts +0 -7
  209. package/lib/Input.d.ts +0 -16
  210. package/lib/List.d.ts +0 -22
  211. package/lib/Modal.d.ts +0 -18
  212. package/lib/Pill.d.ts +0 -13
  213. package/lib/ProgressBar.d.ts +0 -19
  214. package/lib/RadioGroup.d.ts +0 -15
  215. package/lib/Search.d.ts +0 -26
  216. package/lib/SearchContent.d.ts +0 -6
  217. package/lib/SectionHeader.d.ts +0 -18
  218. package/lib/Select.d.ts +0 -19
  219. package/lib/Shield.d.ts +0 -12
  220. package/lib/SideBarNav.d.ts +0 -21
  221. package/lib/Skeleton.d.ts +0 -15
  222. package/lib/SkipLink.d.ts +0 -22
  223. package/lib/Slider.d.ts +0 -14
  224. package/lib/Status.d.ts +0 -10
  225. package/lib/Tabs.d.ts +0 -23
  226. package/lib/Toggle.d.ts +0 -11
  227. package/lib/Tooltip.d.ts +0 -14
@@ -0,0 +1,137 @@
1
+ import React, {
2
+ ReactNode,
3
+ forwardRef,
4
+ useState,
5
+ useCallback,
6
+ Children,
7
+ isValidElement,
8
+ useEffect,
9
+ createContext,
10
+ useContext,
11
+ } from 'react';
12
+ import { twMerge } from 'tailwind-merge';
13
+
14
+ export interface TooltipProps {
15
+ className?: string;
16
+ delay?: number; // delay in ms before showing the tooltip
17
+ id?: string; // id to reference tooltip-content via tooltip
18
+ children: ReactNode;
19
+ }
20
+
21
+ interface TooltipContextType {
22
+ id: string;
23
+ }
24
+
25
+ const TooltipContext = createContext<TooltipContextType | undefined>(undefined);
26
+
27
+ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
28
+ ({ children, delay = 0, className, id='tooltip-content',
29
+ ...props }, ref) => {
30
+
31
+ const [isHovered, setIsHovered] = useState(false);
32
+ let hoverTimeout: ReturnType<typeof setTimeout>;
33
+
34
+ const handleMouseEnter = useCallback(() => {
35
+ hoverTimeout = setTimeout(() => setIsHovered(true), delay);
36
+ }, [delay]);
37
+
38
+ const handleMouseLeave = useCallback(() => {
39
+ clearTimeout(hoverTimeout);
40
+ setIsHovered(false);
41
+ }, []);
42
+
43
+ // Separate the trigger element from the TooltipContent component.
44
+ const childrenArray = Children.toArray(children);
45
+
46
+ const trigger = childrenArray.find((child) => {
47
+ if (isValidElement(child)) {
48
+ // If the child is not a TooltipContent, treat it as the trigger.
49
+ return (child.type as any).displayName !== 'TooltipContent';
50
+ }
51
+ });
52
+
53
+ const tooltipContent = childrenArray.find((child) => {
54
+ if (isValidElement(child)) {
55
+ return (child.type as any).displayName === 'TooltipContent';
56
+ }
57
+ });
58
+
59
+ return (
60
+ <TooltipContext.Provider value={{ id }} >
61
+ <div
62
+ ref={ref}
63
+ className={twMerge('relative inline-block', className)}
64
+ onMouseEnter={handleMouseEnter}
65
+ onMouseLeave={handleMouseLeave}
66
+ aria-describedby={id}
67
+ onFocus={handleMouseEnter} // keyboard support
68
+ onBlur={handleMouseLeave}
69
+ {...props}
70
+ >
71
+ {trigger}
72
+ {isHovered && tooltipContent}
73
+ </div>
74
+ </TooltipContext.Provider>
75
+ );
76
+ }
77
+ );
78
+
79
+ Tooltip.displayName = 'Tooltip';
80
+
81
+ export interface TooltipContentProps {
82
+ children?: ReactNode;
83
+ className?: string;
84
+ position?: string;
85
+ }
86
+
87
+ export const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(
88
+ ({ children, className, position, ...props }, ref) => {
89
+
90
+ const [positionClasses, setPositionClasses] = useState<string>('mt-2');
91
+ const context = useContext(TooltipContext);
92
+ if (!context) {
93
+ throw new Error('TooltipContent must be used within a tooltip');
94
+ }
95
+ const { id } = context;
96
+
97
+ useEffect(() => {
98
+ if (position === 's') {
99
+ setPositionClasses('left-1/2 -translate-x-1/2 top-full mt-2')
100
+ } else if (position === 'n') {
101
+ setPositionClasses('left-1/2 -translate-x-1/2 -top-1 -translate-y-full ')
102
+ } else if (position === 'nw') {
103
+ setPositionClasses('left-0 -top-1 -translate-y-full');
104
+ } else if (position === 'ne') {
105
+ setPositionClasses('right-0 -top-1 -translate-y-full');
106
+ } else if (position === 'se') {
107
+ setPositionClasses('right-0 top-full mt-2');
108
+ } else if (position === 'w') {
109
+ setPositionClasses('-translate-x-full -left-2 -translate-y-1/2 top-1/2');
110
+ } else if (position === 'e') {
111
+ setPositionClasses('-right-2 translate-x-full -translate-y-1/2 top-1/2');
112
+ } else if (position === 'c') {
113
+ setPositionClasses('left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2')
114
+ }
115
+
116
+ }, [position, className]);
117
+
118
+ return (
119
+ <div
120
+ ref={ref}
121
+ id={id}
122
+ role="tooltip"
123
+ className={twMerge(
124
+ 'absolute z-10 px-4 py-2 origin-center bg-slate-800 text-slate-100 ' +
125
+ 'border border-slate-500 text-sm rounded-sm shadow-md',
126
+ positionClasses,
127
+ className
128
+ )}
129
+ {...props}
130
+ >
131
+ {children}
132
+ </div>
133
+ );
134
+ }
135
+ );
136
+
137
+ TooltipContent.displayName = 'TooltipContent';
@@ -0,0 +1,24 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SimpleUi } from './simple-ui';
3
+
4
+ import { within } from '@storybook/test';
5
+ import { expect } from '@storybook/jest';
6
+
7
+ const meta: Meta<typeof SimpleUi> = {
8
+ component: SimpleUi,
9
+ title: 'SimpleUi',
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof SimpleUi>;
13
+
14
+ export const Primary = {
15
+ args: {},
16
+ };
17
+
18
+ export const Heading: Story = {
19
+ args: {},
20
+ play: async ({ canvasElement }) => {
21
+ const canvas = within(canvasElement);
22
+ expect(canvas.getByText(/Welcome to SimpleUi!/gi)).toBeTruthy();
23
+ },
24
+ };
package/src/styles.css ADDED
@@ -0,0 +1,190 @@
1
+ /* tailwind.css ── Tailwind v4, CSS-first configuration */
2
+
3
+ /*
4
+ * 1. Pull in Tailwind’s engine
5
+ * (equivalent to @tailwind base/components/utilities in v3)
6
+ */
7
+ @import "tailwindcss";
8
+
9
+ /* ---------------------------------------------------------------------
10
+ Dynamic utilities that must ALWAYS be present at build-time
11
+ ------------------------------------------------------------------ */
12
+
13
+ /* 1) background-color utilities + variants ------------------------- */
14
+ @source inline("{,hover:,disabled:,md:,lg:}bg-{slate,gray,zinc,neutral,stone,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,{100..900..100},950}");
15
+
16
+ /* 2) logical size (w + h) utilities -------------------------------- */
17
+ @source inline("{,disabled:,md:,lg:}size-{0,px,0.5,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,14,16,20,24,28,32,36,40,44,48,52,56,60,64,72,80,96}");
18
+
19
+ /* 3) SVG fill + stroke colors -------------------------------------- */
20
+ @source inline("fill-{slate,gray,zinc,neutral,stone,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,{100..900..100},950}");
21
+ @source inline("stroke-{slate,gray,zinc,neutral,stone,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,{100..900..100},950}");
22
+
23
+ /* 4) text-color utilities + variants -------------------------------- */
24
+ @source inline("{,hover:,disabled:,md:,lg:}text-{slate,gray,zinc,neutral,stone,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,{100..900..100},950}");
25
+
26
+ /* 5) border-color utilities + variants ------------------------------ */
27
+ @source inline("{,hover:,disabled:}border-{slate,gray,zinc,neutral,stone,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,{100..900..100},950}");
28
+
29
+ /* 6) explicit h-* and w-* for breakpoints --------------------------- */
30
+ @source inline("{,md:,lg:}h-{0,px,0.5,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,14,16,20,24,28,32,36,40,44,48,52,56,60,64,72,80,96}");
31
+ @source inline("{,md:,lg:}w-{0,px,0.5,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,14,16,20,24,28,32,36,40,44,48,52,56,60,64,72,80,96}");
32
+
33
+ /* 7) outline-* (width) and leading-* (line-height) ------------------ */
34
+ @source inline("{,md:,lg:}outline-{0,1,2,4,8}");
35
+ @source inline("{,md:,lg:}leading-{3,4,5,6,7,8,9}");
36
+
37
+ @source './';
38
+
39
+ /*
40
+ * 2. Design tokens ➜ @theme
41
+ * Any --color-* / --radius-* variable declared here becomes a real utility:
42
+ * bg-dha-blue, text-border, rounded-md, etc.
43
+ */
44
+ @theme {
45
+ /* ─── Brand palette ─── */
46
+ --color-dha-dark-blue: #07192d;
47
+ --color-dha-blue: #092068;
48
+ --color-dha-red: #582831;
49
+ --color-dha-grey: #414042;
50
+ --color-dha-light-blue: #5992fa;
51
+ --color-dha-green: #5aab46;
52
+ --color-dha-yellow: #ffd03f;
53
+
54
+ /* ─── Mobile-check palette ─── */
55
+ --color-dha-mc-true-blue: #0256AB;
56
+ --color-dha-mc-pale-blue: #E3EBF3;
57
+ --color-dha-mc-alert: #EB941D;
58
+ --color-dha-mc-alert-border: #CB811B;
59
+ --color-dha-mc-required-field: #D91D1D;
60
+ --color-dha-mc-primary-text: #484848;
61
+ --color-dha-mc-field-border: #707070;
62
+ --color-dha-mc-checkbox-inactive: #949494;
63
+ --color-dha-mc-secondary-border: #C6C6C6;
64
+ --color-dha-mc-inactive-nav-icon-fill: #F0EEEC;
65
+ --color-dha-mc-bottom-nav-background: #F9F9F9;
66
+ --color-dha-mc-white-main: #FFFFFF;
67
+
68
+ /* ─── Semantic palette (HSL channels carried over) ─── */
69
+ --color-border: hsl(var(--border));
70
+ --color-input: hsl(var(--input));
71
+ --color-ring: hsl(var(--ring));
72
+ --color-background: hsl(var(--background));
73
+ --color-foreground: hsl(var(--foreground));
74
+
75
+ --color-primary: hsl(var(--primary));
76
+ --color-primary-foreground: hsl(var(--primary-foreground));
77
+
78
+ --color-secondary: hsl(var(--secondary));
79
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
80
+
81
+ --color-destructive: hsl(var(--destructive));
82
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
83
+
84
+ --color-muted: hsl(var(--muted));
85
+ --color-muted-foreground: hsl(var(--muted-foreground));
86
+
87
+ --color-accent: hsl(var(--accent));
88
+ --color-accent-foreground: hsl(var(--accent-foreground));
89
+
90
+ --color-popover: hsl(var(--popover));
91
+ --color-popover-foreground: hsl(var(--popover-foreground));
92
+
93
+ --color-card: hsl(var(--card));
94
+ --color-card-foreground: hsl(var(--card-foreground));
95
+
96
+ /* ─── Border-radius utilities ─── */
97
+ --radius-lg: var(--radius); /* → rounded-lg */
98
+ --radius-md: calc(var(--radius) - 2px); /* → rounded-md */
99
+ --radius-sm: calc(var(--radius) - 4px); /* → rounded-sm */
100
+ }
101
+
102
+ /*
103
+ * 3. Global CSS variables (unchanged from v3 file)
104
+ * These feed the semantic HSL tokens above.
105
+ */
106
+ @layer base {
107
+ :root {
108
+ --background: 0 0% 100%;
109
+ --foreground: 222.2 84% 4.9%;
110
+
111
+ --card: 0 0% 100%;
112
+ --card-foreground: 222.2 84% 4.9%;
113
+
114
+ --popover: 0 0% 100%;
115
+ --popover-foreground: 222.2 84% 4.9%;
116
+
117
+ --primary: 166 91% 33%;
118
+ --primary-foreground: 163 100% 92%;
119
+
120
+ --secondary: 210 40% 96.1%;
121
+ --secondary-foreground: 222.2 47.4% 11.2%;
122
+
123
+ --muted: 210 40% 96.1%;
124
+ --muted-foreground: 215.4 16.3% 46.9%;
125
+
126
+ --accent: 210 40% 96.1%;
127
+ --accent-foreground: 222.2 47.4% 11.2%;
128
+
129
+ --destructive: 0 84.2% 60.2%;
130
+ --destructive-foreground: 210 40% 98%;
131
+
132
+ --border: 214.3 31.8% 91.4%;
133
+ --input: 214.3 31.8% 91.4%;
134
+ --ring: 222.2 84% 4.9%;
135
+
136
+ --radius: 0.5rem;
137
+ }
138
+
139
+ .dark {
140
+ --background: 222.2 84% 4.9%;
141
+ --foreground: 210 40% 98%;
142
+
143
+ --card: 222.2 84% 4.9%;
144
+ --card-foreground: 210 40% 98%;
145
+
146
+ --popover: 222.2 84% 4.9%;
147
+ --popover-foreground: 210 40% 98%;
148
+
149
+ --primary: 210 40% 98%;
150
+ --primary-foreground: 222.2 47.4% 11.2%;
151
+
152
+ --secondary: 217.2 32.6% 17.5%;
153
+ --secondary-foreground: 210 40% 98%;
154
+
155
+ --muted: 217.2 32.6% 17.5%;
156
+ --muted-foreground: 215 20.2% 65.1%;
157
+
158
+ --accent: 217.2 32.6% 17.5%;
159
+ --accent-foreground: 210 40% 98%;
160
+
161
+ --destructive: 0 62.8% 30.6%;
162
+ --destructive-foreground: 210 40% 98%;
163
+
164
+ --border: 217.2 32.6% 17.5%;
165
+ --input: 217.2 32.6% 17.5%;
166
+ --ring: 212.7 26.8% 83.9%;
167
+ }
168
+
169
+ /* Give every element a logical border color */
170
+ * { @apply border-border; }
171
+ body { @apply bg-background text-foreground; }
172
+ }
173
+
174
+ /*
175
+ * 4. Custom animations (formerly done via tailwindcss-animate + keyframes extension)
176
+ * These stay exactly the same; Tailwind will pick them up automatically.
177
+ */
178
+ @layer utilities {
179
+ @keyframes accordion-down {
180
+ from { height: 0; }
181
+ to { height: var(--radix-accordion-content-height); }
182
+ }
183
+ @keyframes accordion-up {
184
+ from { height: var(--radix-accordion-content-height); }
185
+ to { height: 0; }
186
+ }
187
+
188
+ .animate-accordion-down { animation: accordion-down 0.2s ease-out both; }
189
+ .animate-accordion-up { animation: accordion-up 0.2s ease-out both; }
190
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "jsx": "react-jsx",
4
+ "allowJs": false,
5
+ "esModuleInterop": false,
6
+ "allowSyntheticDefaultImports": true,
7
+ "strict": true,
8
+ "types": ["vite/client", "vitest", "vitest-axe"]
9
+ },
10
+ "files": [],
11
+ "include": ["src/global.d.ts", "src/**/*"],
12
+ "exclude": ["node_modules/@types/jest"],
13
+ "references": [
14
+ {
15
+ "path": "./tsconfig.lib.json"
16
+ },
17
+ {
18
+ "path": "./tsconfig.storybook.json"
19
+ },
20
+ {
21
+ "path": "./tsconfig.spec.json"
22
+ }
23
+ ],
24
+ "extends": "../../tsconfig.base.json"
25
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../../dist/out-tsc",
5
+ "composite": true,
6
+ "declaration": true,
7
+ "emitDeclarationOnly": true,
8
+ "declarationDir": "./dist",
9
+ "types": [
10
+ "node",
11
+ "@nx/react/typings/cssmodule.d.ts",
12
+ "@nx/react/typings/image.d.ts",
13
+ "vite/client"
14
+ ]
15
+ },
16
+ "exclude": [
17
+ "**/*.spec.ts",
18
+ "**/*.test.ts",
19
+ "**/*.spec.tsx",
20
+ "**/*.test.tsx",
21
+ "**/*.spec.js",
22
+ "**/*.test.js",
23
+ "**/*.spec.jsx",
24
+ "**/*.test.jsx",
25
+ "**/*.stories.ts",
26
+ "**/*.stories.js",
27
+ "**/*.stories.jsx",
28
+ "**/*.stories.tsx",
29
+ "../utils/src/lib/safelist.css",
30
+ "../utils/src/lib/utils.spec.tsx"
31
+ ],
32
+ "include": [
33
+ "../utils/src/**/*",
34
+ "src/**/*.js",
35
+ "src/**/*.jsx",
36
+ "src/**/*.ts",
37
+ "src/**/*.tsx",
38
+ "src/*.ts",
39
+ "src/*.tsx"
40
+ ],
41
+
42
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../../dist/out-tsc",
5
+ "composite": true,
6
+ "declaration": true,
7
+ "types": [
8
+ "vitest/globals",
9
+ "vitest/importMeta",
10
+ "vite/client",
11
+ "node",
12
+ "vitest"
13
+ ]
14
+ },
15
+ "include": [
16
+ "vite.config.mts",
17
+ "vitest.config.ts",
18
+ "src/**/*.test.ts",
19
+ "src/**/*.spec.ts",
20
+ "src/**/*.test.tsx",
21
+ "src/**/*.spec.tsx",
22
+ "src/**/*.test.js",
23
+ "src/**/*.spec.js",
24
+ "src/**/*.test.jsx",
25
+ "src/**/*.spec.jsx",
26
+ "src/**/*.d.ts",
27
+ "src/**/*.tsx"
28
+ ]
29
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "emitDecoratorMetadata": true,
5
+ "composite": true,
6
+ "declaration": true,
7
+ "outDir": ""
8
+ },
9
+ "files": [
10
+ "../safelist-css/src/index.ts",
11
+ "../../node_modules/@nx/react/typings/styled-jsx.d.ts",
12
+ "../../node_modules/@nx/react/typings/cssmodule.d.ts",
13
+ "../../node_modules/@nx/react/typings/image.d.ts"
14
+ ],
15
+ "exclude": [
16
+ "src/**/*.spec.ts",
17
+ "src/**/*.test.ts",
18
+ "src/**/*.spec.js",
19
+ "src/**/*.test.js",
20
+ "src/**/*.spec.tsx",
21
+ "src/**/*.test.tsx",
22
+ "src/**/*.spec.jsx",
23
+ "src/**/*.test.js"
24
+ ],
25
+ "include": [
26
+ "@dhasdk/safelist-css",
27
+ "src/**/*.stories.ts",
28
+ "src/**/*.stories.js",
29
+ "src/**/*.stories.jsx",
30
+ "src/**/*.stories.tsx",
31
+ "src/**/*.stories.mdx",
32
+ "src/**/*.tsx",
33
+ ".storybook/*.js",
34
+ ".storybook/*.ts"
35
+ ]
36
+ }
@@ -0,0 +1,87 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import react from '@vitejs/plugin-react';
3
+ import dts from 'vite-plugin-dts';
4
+ import * as path from 'path';
5
+ import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
6
+ import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
7
+ import tailwindcss from '@tailwindcss/vite';
8
+ // import svgr from 'vite-plugin-svgr';
9
+
10
+ export default defineConfig({
11
+ test: {
12
+ watch: false,
13
+ globals: true,
14
+ environment: 'jsdom',
15
+ setupFiles: './vitest.setup.ts',
16
+ include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
17
+
18
+ reporters: ['default'],
19
+ coverage: {
20
+ reportsDirectory: '../../coverage/libs/simple-ui',
21
+ provider: 'v8', // v8 or istanbul, both coverage packages installed globally
22
+ exclude: [
23
+ '**/*.stories.tsx',
24
+ '**/*.stories.tsx', '*.config.js',
25
+ 'coverage/**',
26
+ 'coverage/*.*',
27
+ '.storybook/*.ts',
28
+ '../.storybook/*.ts',
29
+ 'src/index.ts',
30
+ 'src/lib/SearchContent.tsx',
31
+ ]
32
+ },
33
+ },
34
+ root: __dirname,
35
+ cacheDir: '../../node_modules/.vite/libs/simple-ui',
36
+
37
+ plugins: [
38
+ react(),
39
+ tailwindcss(),
40
+ nxViteTsPaths(),
41
+ nxCopyAssetsPlugin(['*.md']),
42
+ dts({
43
+ entryRoot: 'src',
44
+ tsconfigPath: path.join(__dirname, 'tsconfig.lib.json'),
45
+ }),
46
+ ],
47
+
48
+ resolve: {
49
+ alias: {
50
+ // + /GuidedMeditation/SomeFile.tsx
51
+ '@/simple-ui': path.resolve(__dirname, 'libs/simple-ui'),
52
+ // "@/assets/audio/GuidedMeditation": path.resolve(__dirname, "src/GuidedMeditation/assets/audio"),
53
+ // "@/modules": path.resolve(__dirname, "libs/guided-meditation/src"),
54
+ },
55
+ },
56
+
57
+ // Uncomment this if you are using workers.
58
+ // worker: {
59
+ // plugins: [ nxViteTsPaths() ],
60
+ // },
61
+
62
+ // Configuration for building your library.
63
+ // See: https://vitejs.dev/guide/build.html#library-mode
64
+ build: {
65
+ outDir: '../../dist/libs/simple-ui',
66
+ emptyOutDir: true,
67
+ reportCompressedSize: true,
68
+ commonjsOptions: {
69
+ transformMixedEsModules: true,
70
+ },
71
+ lib: {
72
+ // Could also be a dictionary or array of multiple entry points.
73
+ entry: 'src/index.ts',
74
+ name: 'simple-ui',
75
+ fileName: 'index',
76
+ // Change this to the formats you want to support.
77
+ // Don't forget to update your package.json as well.
78
+ formats: ['es', 'cjs'],
79
+ },
80
+ rollupOptions: {
81
+ // External packages that should not be bundled into your library.
82
+ external: ['react', 'react-dom', 'react-router-dom', 'react/jsx-runtime'],
83
+ },
84
+ // sourcemap: true, // enable source map for unit test coverage
85
+ // update re sourcemap - apparently not needed? run unit tests from source directory, not repo root
86
+ },
87
+ });
@@ -0,0 +1,12 @@
1
+ // vitest.setup.ts
2
+ import '@testing-library/jest-dom';
3
+ import "vitest-axe/extend-expect";
4
+ import * as matchers from "vitest-axe/matchers";
5
+ import { expect } from "vitest";
6
+ import { vi } from 'vitest'; // imported as bandaid for Canvas testing problem
7
+
8
+
9
+ expect.extend(matchers);
10
+
11
+ HTMLCanvasElement.prototype.getContext = vi.fn(() => null); // executred as bandaid for Canvas testing problem
12
+