@tribepad/themis 1.0.16 → 1.0.19

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 (210) hide show
  1. package/dist/elements/Accordion/Accordion.d.ts +3 -1
  2. package/dist/elements/Accordion/Accordion.d.ts.map +1 -1
  3. package/dist/elements/Accordion/index.js +1 -1
  4. package/dist/elements/Accordion/index.js.map +1 -1
  5. package/dist/elements/Accordion/index.mjs +1 -1
  6. package/dist/elements/Accordion/index.mjs.map +1 -1
  7. package/dist/elements/AlertDialog/index.js +1 -1
  8. package/dist/elements/AlertDialog/index.js.map +1 -1
  9. package/dist/elements/AlertDialog/index.mjs +1 -1
  10. package/dist/elements/AlertDialog/index.mjs.map +1 -1
  11. package/dist/elements/Breadcrumbs/index.js +1 -1
  12. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  13. package/dist/elements/Breadcrumbs/index.mjs +1 -1
  14. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  15. package/dist/elements/Button/Button.d.ts.map +1 -1
  16. package/dist/elements/Button/index.js +1 -1
  17. package/dist/elements/Button/index.js.map +1 -1
  18. package/dist/elements/Button/index.mjs +1 -1
  19. package/dist/elements/Button/index.mjs.map +1 -1
  20. package/dist/elements/Card/Card.d.ts +21 -1
  21. package/dist/elements/Card/Card.d.ts.map +1 -1
  22. package/dist/elements/Card/Card.types.d.ts +36 -0
  23. package/dist/elements/Card/Card.types.d.ts.map +1 -1
  24. package/dist/elements/Card/index.d.ts +10 -3
  25. package/dist/elements/Card/index.d.ts.map +1 -1
  26. package/dist/elements/Card/index.js +1 -1
  27. package/dist/elements/Card/index.js.map +1 -1
  28. package/dist/elements/Card/index.mjs +1 -1
  29. package/dist/elements/Card/index.mjs.map +1 -1
  30. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  31. package/dist/elements/Carousel/index.js +1 -1
  32. package/dist/elements/Carousel/index.js.map +1 -1
  33. package/dist/elements/Carousel/index.mjs +1 -1
  34. package/dist/elements/Carousel/index.mjs.map +1 -1
  35. package/dist/elements/Chart/Chart.d.ts.map +1 -1
  36. package/dist/elements/Chart/Chart.types.d.ts +21 -4
  37. package/dist/elements/Chart/Chart.types.d.ts.map +1 -1
  38. package/dist/elements/Chart/ChartAreaSeries.d.ts +32 -0
  39. package/dist/elements/Chart/ChartAreaSeries.d.ts.map +1 -0
  40. package/dist/elements/Chart/ChartContext.d.ts +4 -1
  41. package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
  42. package/dist/elements/Chart/ChartLegend.d.ts +2 -2
  43. package/dist/elements/Chart/ChartLegend.d.ts.map +1 -1
  44. package/dist/elements/Chart/ChartPieSeries.d.ts +28 -0
  45. package/dist/elements/Chart/ChartPieSeries.d.ts.map +1 -0
  46. package/dist/elements/Chart/ChartRadarSeries.d.ts +28 -0
  47. package/dist/elements/Chart/ChartRadarSeries.d.ts.map +1 -0
  48. package/dist/elements/Chart/ChartSVG.d.ts +7 -1
  49. package/dist/elements/Chart/ChartSVG.d.ts.map +1 -1
  50. package/dist/elements/Chart/ChartScatterSeries.d.ts +31 -0
  51. package/dist/elements/Chart/ChartScatterSeries.d.ts.map +1 -0
  52. package/dist/elements/Chart/index.js +1 -1
  53. package/dist/elements/Chart/index.js.map +1 -1
  54. package/dist/elements/Chart/index.mjs +1 -1
  55. package/dist/elements/Chart/index.mjs.map +1 -1
  56. package/dist/elements/Checkbox/index.js +1 -1
  57. package/dist/elements/Checkbox/index.js.map +1 -1
  58. package/dist/elements/Checkbox/index.mjs +1 -1
  59. package/dist/elements/Checkbox/index.mjs.map +1 -1
  60. package/dist/elements/ColorPicker/ColorPicker.d.ts +20 -0
  61. package/dist/elements/ColorPicker/ColorPicker.d.ts.map +1 -0
  62. package/dist/elements/ColorPicker/ColorPicker.styles.d.ts +74 -0
  63. package/dist/elements/ColorPicker/ColorPicker.styles.d.ts.map +1 -0
  64. package/dist/elements/ColorPicker/ColorPicker.types.d.ts +113 -0
  65. package/dist/elements/ColorPicker/ColorPicker.types.d.ts.map +1 -0
  66. package/dist/elements/ColorPicker/index.d.ts +5 -0
  67. package/dist/elements/ColorPicker/index.d.ts.map +1 -0
  68. package/dist/elements/ColorPicker/index.js +3 -0
  69. package/dist/elements/ColorPicker/index.js.map +1 -0
  70. package/dist/elements/ColorPicker/index.mjs +3 -0
  71. package/dist/elements/ColorPicker/index.mjs.map +1 -0
  72. package/dist/elements/Combobox/Combobox.d.ts +1 -1
  73. package/dist/elements/Combobox/Combobox.d.ts.map +1 -1
  74. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -1
  75. package/dist/elements/Combobox/index.js +1 -1
  76. package/dist/elements/Combobox/index.js.map +1 -1
  77. package/dist/elements/Combobox/index.mjs +1 -1
  78. package/dist/elements/Combobox/index.mjs.map +1 -1
  79. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  80. package/dist/elements/DatePicker/DatePicker.types.d.ts +6 -6
  81. package/dist/elements/DatePicker/index.js +1 -1
  82. package/dist/elements/DatePicker/index.js.map +1 -1
  83. package/dist/elements/DatePicker/index.mjs +1 -1
  84. package/dist/elements/DatePicker/index.mjs.map +1 -1
  85. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  86. package/dist/elements/Dropdown/index.js +1 -1
  87. package/dist/elements/Dropdown/index.js.map +1 -1
  88. package/dist/elements/Dropdown/index.mjs +1 -1
  89. package/dist/elements/Dropdown/index.mjs.map +1 -1
  90. package/dist/elements/FileField/index.js +1 -1
  91. package/dist/elements/FileField/index.js.map +1 -1
  92. package/dist/elements/FileField/index.mjs +1 -1
  93. package/dist/elements/FileField/index.mjs.map +1 -1
  94. package/dist/elements/Modal/Modal.d.ts +2 -1
  95. package/dist/elements/Modal/Modal.d.ts.map +1 -1
  96. package/dist/elements/Modal/index.js +1 -1
  97. package/dist/elements/Modal/index.js.map +1 -1
  98. package/dist/elements/Modal/index.mjs +1 -1
  99. package/dist/elements/Modal/index.mjs.map +1 -1
  100. package/dist/elements/NumberField/NumberField.d.ts.map +1 -1
  101. package/dist/elements/NumberField/NumberField.types.d.ts +1 -1
  102. package/dist/elements/NumberField/NumberField.variants.d.ts.map +1 -1
  103. package/dist/elements/NumberField/index.js +1 -1
  104. package/dist/elements/NumberField/index.js.map +1 -1
  105. package/dist/elements/NumberField/index.mjs +1 -1
  106. package/dist/elements/NumberField/index.mjs.map +1 -1
  107. package/dist/elements/OTPInput/OTPInput.d.ts +1 -1
  108. package/dist/elements/OTPInput/index.js +1 -1
  109. package/dist/elements/OTPInput/index.js.map +1 -1
  110. package/dist/elements/OTPInput/index.mjs +1 -1
  111. package/dist/elements/OTPInput/index.mjs.map +1 -1
  112. package/dist/elements/Pagination/index.js +1 -1
  113. package/dist/elements/Pagination/index.js.map +1 -1
  114. package/dist/elements/Pagination/index.mjs +1 -1
  115. package/dist/elements/Pagination/index.mjs.map +1 -1
  116. package/dist/elements/Panel/index.js +1 -1
  117. package/dist/elements/Panel/index.js.map +1 -1
  118. package/dist/elements/Panel/index.mjs +1 -1
  119. package/dist/elements/Panel/index.mjs.map +1 -1
  120. package/dist/elements/PasswordField/index.js +1 -1
  121. package/dist/elements/PasswordField/index.js.map +1 -1
  122. package/dist/elements/PasswordField/index.mjs +1 -1
  123. package/dist/elements/PasswordField/index.mjs.map +1 -1
  124. package/dist/elements/Progress/index.js +1 -1
  125. package/dist/elements/Progress/index.js.map +1 -1
  126. package/dist/elements/Progress/index.mjs +1 -1
  127. package/dist/elements/Progress/index.mjs.map +1 -1
  128. package/dist/elements/RatingScale/index.js +1 -1
  129. package/dist/elements/RatingScale/index.js.map +1 -1
  130. package/dist/elements/RatingScale/index.mjs +1 -1
  131. package/dist/elements/RatingScale/index.mjs.map +1 -1
  132. package/dist/elements/Resizable/index.js +1 -1
  133. package/dist/elements/Resizable/index.js.map +1 -1
  134. package/dist/elements/Resizable/index.mjs +1 -1
  135. package/dist/elements/Resizable/index.mjs.map +1 -1
  136. package/dist/elements/SearchField/index.js +1 -1
  137. package/dist/elements/SearchField/index.js.map +1 -1
  138. package/dist/elements/SearchField/index.mjs +1 -1
  139. package/dist/elements/SearchField/index.mjs.map +1 -1
  140. package/dist/elements/Select/Select.d.ts.map +1 -1
  141. package/dist/elements/Select/Select.styles.d.ts.map +1 -1
  142. package/dist/elements/Select/index.js +1 -1
  143. package/dist/elements/Select/index.js.map +1 -1
  144. package/dist/elements/Select/index.mjs +1 -1
  145. package/dist/elements/Select/index.mjs.map +1 -1
  146. package/dist/elements/SituationalJudgement/index.js +1 -1
  147. package/dist/elements/SituationalJudgement/index.js.map +1 -1
  148. package/dist/elements/SituationalJudgement/index.mjs +1 -1
  149. package/dist/elements/SituationalJudgement/index.mjs.map +1 -1
  150. package/dist/elements/Table/index.js +1 -1
  151. package/dist/elements/Table/index.js.map +1 -1
  152. package/dist/elements/Table/index.mjs +1 -1
  153. package/dist/elements/Table/index.mjs.map +1 -1
  154. package/dist/elements/Tabs/index.js +1 -1
  155. package/dist/elements/Tabs/index.js.map +1 -1
  156. package/dist/elements/Tabs/index.mjs +1 -1
  157. package/dist/elements/Tabs/index.mjs.map +1 -1
  158. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  159. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -1
  160. package/dist/elements/TextField/index.js +1 -1
  161. package/dist/elements/TextField/index.js.map +1 -1
  162. package/dist/elements/TextField/index.mjs +1 -1
  163. package/dist/elements/TextField/index.mjs.map +1 -1
  164. package/dist/elements/TimeField/TimeField.d.ts.map +1 -1
  165. package/dist/elements/TimeField/TimeField.types.d.ts.map +1 -1
  166. package/dist/elements/TimeField/index.js +1 -1
  167. package/dist/elements/TimeField/index.js.map +1 -1
  168. package/dist/elements/TimeField/index.mjs +1 -1
  169. package/dist/elements/TimeField/index.mjs.map +1 -1
  170. package/dist/elements/Toast/Toast.d.ts +21 -43
  171. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  172. package/dist/elements/Toast/Toast.types.d.ts +27 -1
  173. package/dist/elements/Toast/Toast.types.d.ts.map +1 -1
  174. package/dist/elements/Toast/Toaster.d.ts +0 -12
  175. package/dist/elements/Toast/Toaster.d.ts.map +1 -1
  176. package/dist/elements/Toast/index.d.ts +1 -1
  177. package/dist/elements/Toast/index.d.ts.map +1 -1
  178. package/dist/elements/Toast/index.js +1 -1
  179. package/dist/elements/Toast/index.js.map +1 -1
  180. package/dist/elements/Toast/index.mjs +1 -1
  181. package/dist/elements/Toast/index.mjs.map +1 -1
  182. package/dist/elements/Tooltip/index.js +1 -1
  183. package/dist/elements/Tooltip/index.js.map +1 -1
  184. package/dist/elements/Tooltip/index.mjs +1 -1
  185. package/dist/elements/Tooltip/index.mjs.map +1 -1
  186. package/dist/elements/index.d.ts +3 -1
  187. package/dist/elements/index.d.ts.map +1 -1
  188. package/dist/elements/index.js +1 -1
  189. package/dist/elements/index.js.map +1 -1
  190. package/dist/elements/index.mjs +1 -1
  191. package/dist/elements/index.mjs.map +1 -1
  192. package/dist/index.js +2 -2
  193. package/dist/index.js.map +1 -1
  194. package/dist/index.mjs +2 -2
  195. package/dist/index.mjs.map +1 -1
  196. package/dist/styles/animations.css +110 -0
  197. package/dist/styles/defaults.css +32 -0
  198. package/dist/styles/index.d.ts +1 -1
  199. package/dist/styles/index.d.ts.map +1 -1
  200. package/dist/styles/index.js +1 -1
  201. package/dist/styles/index.js.map +1 -1
  202. package/dist/styles/index.mjs +1 -1
  203. package/dist/styles/index.mjs.map +1 -1
  204. package/dist/styles/shared-variants.d.ts +21 -2
  205. package/dist/styles/shared-variants.d.ts.map +1 -1
  206. package/package.json +35 -34
  207. package/src/elements/Chart/Chart.stories.tsx +186 -2
  208. package/src/elements/ColorPicker/ColorPicker.stories.tsx +289 -0
  209. package/src/elements/Modal/Modal.stories.tsx +6 -9
  210. package/src/elements/Toast/Toast.stories.tsx +745 -648
@@ -29,8 +29,8 @@ const meta = {
29
29
  argTypes: {
30
30
  type: {
31
31
  control: 'select',
32
- options: ['bar', 'line'],
33
- description: 'Chart type: bar or line',
32
+ options: ['bar', 'line', 'area', 'scatter', 'pie', 'radar'],
33
+ description: 'Chart type',
34
34
  },
35
35
  variant: {
36
36
  control: 'select',
@@ -614,3 +614,187 @@ export const AllThemes: Story = {
614
614
  </div>
615
615
  ),
616
616
  };
617
+
618
+ // ============================================================================
619
+ // Area Chart Stories
620
+ // ============================================================================
621
+
622
+ const areaData: DataSeries[] = [
623
+ {
624
+ name: 'Done',
625
+ color: '#155e75',
626
+ data: [
627
+ { label: 'Week 1', value: 5 },
628
+ { label: 'Week 2', value: 12 },
629
+ { label: 'Week 3', value: 18 },
630
+ { label: 'Week 4', value: 25 },
631
+ ],
632
+ },
633
+ {
634
+ name: 'In Progress',
635
+ color: '#1e40af',
636
+ data: [
637
+ { label: 'Week 1', value: 8 },
638
+ { label: 'Week 2', value: 6 },
639
+ { label: 'Week 3', value: 10 },
640
+ { label: 'Week 4', value: 7 },
641
+ ],
642
+ },
643
+ {
644
+ name: 'Backlog',
645
+ color: '#64748b',
646
+ data: [
647
+ { label: 'Week 1', value: 20 },
648
+ { label: 'Week 2', value: 15 },
649
+ { label: 'Week 3', value: 10 },
650
+ { label: 'Week 4', value: 6 },
651
+ ],
652
+ },
653
+ ];
654
+
655
+ export const AreaChart: Story = {
656
+ args: {
657
+ data: areaData,
658
+ type: 'area',
659
+ title: 'Cumulative Flow',
660
+ description: 'Stacked area showing card distribution over time',
661
+ xAxisLabel: 'Week',
662
+ yAxisLabel: 'Cards',
663
+ stacked: true,
664
+ },
665
+ };
666
+
667
+ export const AreaChartUnstacked: Story = {
668
+ args: {
669
+ data: areaData.slice(0, 2),
670
+ type: 'area',
671
+ title: 'Overlapping Areas',
672
+ description: 'Non-stacked area chart with overlapping series',
673
+ xAxisLabel: 'Week',
674
+ yAxisLabel: 'Cards',
675
+ stacked: false,
676
+ },
677
+ };
678
+
679
+ // ============================================================================
680
+ // Scatter Chart Stories
681
+ // ============================================================================
682
+
683
+ const scatterData: DataSeries[] = [
684
+ {
685
+ name: 'Story',
686
+ color: '#1e40af',
687
+ data: [
688
+ { label: '1 SP', value: 2 },
689
+ { label: '2 SP', value: 3 },
690
+ { label: '3 SP', value: 5 },
691
+ { label: '5 SP', value: 8 },
692
+ { label: '8 SP', value: 12 },
693
+ ],
694
+ },
695
+ {
696
+ name: 'Bug',
697
+ color: '#9a3412',
698
+ data: [
699
+ { label: '1 SP', value: 1 },
700
+ { label: '2 SP', value: 2 },
701
+ { label: '3 SP', value: 4 },
702
+ { label: '5 SP', value: 6 },
703
+ ],
704
+ },
705
+ ];
706
+
707
+ export const ScatterChart: Story = {
708
+ args: {
709
+ data: scatterData,
710
+ type: 'scatter',
711
+ title: 'Cycle Time vs Story Points',
712
+ description: 'Each point represents a completed card',
713
+ xAxisLabel: 'Story Points',
714
+ yAxisLabel: 'Cycle Time (days)',
715
+ },
716
+ };
717
+
718
+ // ============================================================================
719
+ // Pie / Donut Chart Stories
720
+ // ============================================================================
721
+
722
+ const pieData: DataSeries[] = [
723
+ {
724
+ name: 'Investment',
725
+ data: [
726
+ { label: 'Features', value: 12 },
727
+ { label: 'Bugs', value: 5 },
728
+ { label: 'Tech Debt', value: 3 },
729
+ { label: 'Spikes', value: 2 },
730
+ ],
731
+ },
732
+ ];
733
+
734
+ export const PieChart: Story = {
735
+ args: {
736
+ data: pieData,
737
+ type: 'pie',
738
+ title: 'Investment Balance',
739
+ description: 'Distribution of cards by type',
740
+ },
741
+ };
742
+
743
+ export const DonutChart: Story = {
744
+ args: {
745
+ data: pieData,
746
+ type: 'pie',
747
+ innerRadius: 50,
748
+ title: 'Investment Balance (Donut)',
749
+ description: 'Donut variant with inner radius',
750
+ },
751
+ };
752
+
753
+ // ============================================================================
754
+ // Radar Chart Stories
755
+ // ============================================================================
756
+
757
+ const radarData: DataSeries[] = [
758
+ {
759
+ name: 'Performance',
760
+ color: '#1e40af',
761
+ data: [
762
+ { label: 'Deploy Freq', value: 75 },
763
+ { label: 'Lead Time', value: 50 },
764
+ { label: 'Change Fail', value: 25 },
765
+ { label: 'Recovery', value: 75 },
766
+ { label: 'Rework', value: 75 },
767
+ ],
768
+ },
769
+ ];
770
+
771
+ export const RadarChart: Story = {
772
+ args: {
773
+ data: radarData,
774
+ type: 'radar',
775
+ title: 'DORA Performance',
776
+ description: 'Radar view of DORA metrics',
777
+ },
778
+ };
779
+
780
+ export const RadarChartMultiSeries: Story = {
781
+ args: {
782
+ data: [
783
+ ...radarData,
784
+ {
785
+ name: 'Target',
786
+ color: '#155e75',
787
+ data: [
788
+ { label: 'Deploy Freq', value: 90 },
789
+ { label: 'Lead Time', value: 80 },
790
+ { label: 'Change Fail', value: 90 },
791
+ { label: 'Recovery', value: 85 },
792
+ { label: 'Rework', value: 80 },
793
+ ],
794
+ },
795
+ ],
796
+ type: 'radar',
797
+ title: 'DORA: Actual vs Target',
798
+ description: 'Multi-series radar comparing current performance to targets',
799
+ },
800
+ };
@@ -0,0 +1,289 @@
1
+ /**
2
+ * ColorPicker Component Stories
3
+ *
4
+ * Storybook stories demonstrating all modes, variants, sizes, and states.
5
+ */
6
+
7
+ import { useState } from 'react';
8
+ import type { Meta, StoryObj } from '@storybook/react-vite';
9
+ import { ColorPicker } from './ColorPicker';
10
+ import type { Color } from 'react-aria-components';
11
+
12
+ const meta = {
13
+ title: 'Elements/ColorPicker',
14
+ component: ColorPicker,
15
+ parameters: {
16
+ layout: 'centered',
17
+ docs: {
18
+ description: {
19
+ component:
20
+ 'Accessible color picker with swatch presets, advanced picker, or both. Built on React Aria ColorPicker and ColorSwatchPicker primitives for WCAG 2.2 AAA compliance.',
21
+ },
22
+ },
23
+ },
24
+ tags: ['autodocs'],
25
+ argTypes: {
26
+ mode: {
27
+ control: 'select',
28
+ options: ['swatch', 'advanced', 'both'],
29
+ description: 'Which picker UI to display',
30
+ table: { defaultValue: { summary: 'both' } },
31
+ },
32
+ size: {
33
+ control: 'select',
34
+ options: ['sm', 'default', 'lg'],
35
+ description: 'Size variant',
36
+ table: { defaultValue: { summary: 'default' } },
37
+ },
38
+ label: {
39
+ control: 'text',
40
+ description: 'Label text',
41
+ },
42
+ description: {
43
+ control: 'text',
44
+ description: 'Helper text below the label',
45
+ },
46
+ errorMessage: {
47
+ control: 'text',
48
+ description: 'Error message when isInvalid is true',
49
+ },
50
+ isDisabled: {
51
+ control: 'boolean',
52
+ description: 'Whether the picker is disabled',
53
+ },
54
+ isRequired: {
55
+ control: 'boolean',
56
+ description: 'Whether a value is required',
57
+ },
58
+ isInvalid: {
59
+ control: 'boolean',
60
+ description: 'Whether the field is in an invalid state',
61
+ },
62
+ isReadOnly: {
63
+ control: 'boolean',
64
+ description: 'Whether the field is read-only',
65
+ },
66
+ },
67
+ } satisfies Meta<typeof ColorPicker>;
68
+
69
+ export default meta;
70
+ type Story = StoryObj<typeof meta>;
71
+
72
+ // =============================================================================
73
+ // Default (Both Mode)
74
+ // =============================================================================
75
+
76
+ export const Default: Story = {
77
+ args: {
78
+ label: 'Brand Color',
79
+ defaultValue: '#7c3aed',
80
+ },
81
+ };
82
+
83
+ // =============================================================================
84
+ // Swatch Only
85
+ // =============================================================================
86
+
87
+ export const SwatchOnly: Story = {
88
+ args: {
89
+ label: 'Pick a color',
90
+ mode: 'swatch',
91
+ defaultValue: '#ff0000',
92
+ },
93
+ };
94
+
95
+ // =============================================================================
96
+ // Advanced Only
97
+ // =============================================================================
98
+
99
+ export const AdvancedOnly: Story = {
100
+ args: {
101
+ label: 'Custom Color',
102
+ mode: 'advanced',
103
+ defaultValue: '#4a86e8',
104
+ },
105
+ };
106
+
107
+ // =============================================================================
108
+ // Custom Swatch Colors
109
+ // =============================================================================
110
+
111
+ export const CustomColors: Story = {
112
+ args: {
113
+ label: 'Theme Color',
114
+ mode: 'swatch',
115
+ colors: [
116
+ '#ef4444', '#f97316', '#eab308', '#22c55e',
117
+ '#06b6d4', '#3b82f6', '#8b5cf6', '#ec4899',
118
+ ],
119
+ defaultValue: '#3b82f6',
120
+ },
121
+ };
122
+
123
+ // =============================================================================
124
+ // With Description
125
+ // =============================================================================
126
+
127
+ export const WithDescription: Story = {
128
+ args: {
129
+ label: 'Brand Color',
130
+ description: 'Choose the primary color for your brand. This will be used across all marketing materials.',
131
+ defaultValue: '#7c3aed',
132
+ },
133
+ };
134
+
135
+ // =============================================================================
136
+ // Required
137
+ // =============================================================================
138
+
139
+ export const Required: Story = {
140
+ args: {
141
+ label: 'Primary Color',
142
+ isRequired: true,
143
+ defaultValue: '#000000',
144
+ },
145
+ };
146
+
147
+ // =============================================================================
148
+ // Invalid State
149
+ // =============================================================================
150
+
151
+ export const Invalid: Story = {
152
+ args: {
153
+ label: 'Color',
154
+ isInvalid: true,
155
+ errorMessage: 'Please select a valid brand color',
156
+ defaultValue: '#000000',
157
+ },
158
+ };
159
+
160
+ // =============================================================================
161
+ // Disabled
162
+ // =============================================================================
163
+
164
+ export const Disabled: Story = {
165
+ args: {
166
+ label: 'Color',
167
+ isDisabled: true,
168
+ defaultValue: '#7c3aed',
169
+ },
170
+ };
171
+
172
+ // =============================================================================
173
+ // Read Only
174
+ // =============================================================================
175
+
176
+ export const ReadOnly: Story = {
177
+ args: {
178
+ label: 'Assigned Color',
179
+ isReadOnly: true,
180
+ defaultValue: '#22c55e',
181
+ },
182
+ };
183
+
184
+ // =============================================================================
185
+ // Size: Small
186
+ // =============================================================================
187
+
188
+ export const SizeSmall: Story = {
189
+ args: {
190
+ label: 'Color',
191
+ size: 'sm',
192
+ defaultValue: '#ff0000',
193
+ },
194
+ };
195
+
196
+ // =============================================================================
197
+ // Size: Large
198
+ // =============================================================================
199
+
200
+ export const SizeLarge: Story = {
201
+ args: {
202
+ label: 'Color',
203
+ size: 'lg',
204
+ defaultValue: '#0000ff',
205
+ },
206
+ };
207
+
208
+ // =============================================================================
209
+ // Controlled
210
+ // =============================================================================
211
+
212
+ function ControlledExample() {
213
+ const [hex, setHex] = useState('#7c3aed');
214
+
215
+ return (
216
+ <div className="flex flex-col gap-4">
217
+ <ColorPicker
218
+ label="Controlled Color"
219
+ value={hex}
220
+ onChange={(color: Color) => setHex(color.toString('hex'))}
221
+ />
222
+ <p className="text-sm text-[var(--muted-foreground)]">
223
+ Selected: <code className="font-mono">{hex}</code>
224
+ </p>
225
+ </div>
226
+ );
227
+ }
228
+
229
+ export const Controlled: Story = {
230
+ render: () => <ControlledExample />,
231
+ };
232
+
233
+ // =============================================================================
234
+ // With Form Name
235
+ // =============================================================================
236
+
237
+ export const WithFormName: Story = {
238
+ args: {
239
+ label: 'Brand Color',
240
+ name: 'brand_color',
241
+ defaultValue: '#7c3aed',
242
+ description: 'This color will be submitted as a hidden form field named "brand_color".',
243
+ },
244
+ };
245
+
246
+ // =============================================================================
247
+ // All Sizes Comparison
248
+ // =============================================================================
249
+
250
+ function AllSizesExample() {
251
+ return (
252
+ <div className="flex flex-col gap-6">
253
+ <ColorPicker label="Small" size="sm" mode="advanced" defaultValue="#ef4444" />
254
+ <ColorPicker label="Default" size="default" mode="advanced" defaultValue="#3b82f6" />
255
+ <ColorPicker label="Large" size="lg" mode="advanced" defaultValue="#22c55e" />
256
+ </div>
257
+ );
258
+ }
259
+
260
+ export const AllSizes: Story = {
261
+ render: () => <AllSizesExample />,
262
+ };
263
+
264
+ // =============================================================================
265
+ // All Modes Comparison
266
+ // =============================================================================
267
+
268
+ function AllModesExample() {
269
+ return (
270
+ <div className="flex flex-col gap-8">
271
+ <div>
272
+ <h3 className="text-sm font-medium mb-2 text-[var(--content-foreground)]">Swatch Only</h3>
273
+ <ColorPicker mode="swatch" defaultValue="#ff0000" />
274
+ </div>
275
+ <div>
276
+ <h3 className="text-sm font-medium mb-2 text-[var(--content-foreground)]">Advanced Only</h3>
277
+ <ColorPicker mode="advanced" defaultValue="#3b82f6" />
278
+ </div>
279
+ <div>
280
+ <h3 className="text-sm font-medium mb-2 text-[var(--content-foreground)]">Both (Default)</h3>
281
+ <ColorPicker mode="both" defaultValue="#7c3aed" />
282
+ </div>
283
+ </div>
284
+ );
285
+ }
286
+
287
+ export const AllModes: Story = {
288
+ render: () => <AllModesExample />,
289
+ };
@@ -357,8 +357,8 @@ export const NotDismissable: Story = {
357
357
 
358
358
  /**
359
359
  * Controlled Mode
360
- * Modal with external state control
361
- * Demonstrates programmatic open/close
360
+ * Modal with external state control and no trigger
361
+ * Demonstrates programmatic open/close without Modal.Trigger
362
362
  */
363
363
  export const ControlledMode: Story = {
364
364
  render: () => {
@@ -368,8 +368,8 @@ export const ControlledMode: Story = {
368
368
  return (
369
369
  <div className="space-y-4">
370
370
  <div className="flex gap-2">
371
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
372
- <Button variant="outline" onClick={() => setIsOpen(false)}>
371
+ <Button onPress={() => setIsOpen(true)}>Open Modal</Button>
372
+ <Button variant="outline" onPress={() => setIsOpen(false)}>
373
373
  Close Modal
374
374
  </Button>
375
375
  </div>
@@ -377,15 +377,12 @@ export const ControlledMode: Story = {
377
377
  Modal is currently: {isOpen ? 'Open' : 'Closed'}
378
378
  </p>
379
379
  <Modal isOpen={isOpen} onOpenChange={setIsOpen}>
380
- <Modal.Trigger>
381
- <Button>Toggle Modal</Button>
382
- </Modal.Trigger>
383
380
  <Modal.Content>
384
381
  <Modal.Header>
385
382
  <Modal.Title>Controlled Modal</Modal.Title>
386
383
  <Modal.Description>
387
- This modal is controlled via external state. You can open or
388
- close it using the buttons above.
384
+ This modal is controlled via external state with no
385
+ Modal.Trigger. Open and close it using the buttons above.
389
386
  </Modal.Description>
390
387
  </Modal.Header>
391
388
  <Modal.Footer>