@sbkbs/ui 1.0.3 → 1.0.4

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 (125) hide show
  1. package/dist/components/Accordion/Accordion.js +56 -0
  2. package/dist/components/Accordion/Accordion.js.map +1 -0
  3. package/dist/components/Accordion/Accordion.stories.d.ts +7 -0
  4. package/dist/components/Alert/Alert.js +32 -0
  5. package/dist/components/Alert/Alert.js.map +1 -0
  6. package/dist/components/Alert/Alert.stories.d.ts +8 -0
  7. package/dist/components/Badge/Badge.js +35 -0
  8. package/dist/components/Badge/Badge.js.map +1 -0
  9. package/dist/components/Badge/Badge.stories.d.ts +8 -0
  10. package/dist/components/Breadcrumb/Breadcrumb.d.ts +10 -0
  11. package/dist/components/Breadcrumb/Breadcrumb.js +26 -0
  12. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
  13. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -0
  14. package/dist/components/Button/Button.js +122 -0
  15. package/dist/components/Button/Button.js.map +1 -0
  16. package/dist/components/Card/Card.js +33 -0
  17. package/dist/components/Card/Card.js.map +1 -0
  18. package/dist/components/Card/Card.stories.d.ts +8 -0
  19. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  20. package/dist/components/Checkbox/Checkbox.js +36 -0
  21. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  22. package/dist/components/Checkbox/Checkbox.stories.d.ts +7 -0
  23. package/dist/components/Chip/Chip.js +19 -0
  24. package/dist/components/Chip/Chip.js.map +1 -0
  25. package/dist/components/Combobox/Combobox.d.ts +17 -0
  26. package/dist/components/Combobox/Combobox.js +143 -0
  27. package/dist/components/Combobox/Combobox.js.map +1 -0
  28. package/dist/components/Combobox/Combobox.stories.d.ts +9 -0
  29. package/dist/components/Divider/Divider.js +22 -0
  30. package/dist/components/Divider/Divider.js.map +1 -0
  31. package/dist/components/EmptyState/EmptyState.js +29 -0
  32. package/dist/components/EmptyState/EmptyState.js.map +1 -0
  33. package/dist/components/FileUpload/FileUpload.d.ts +13 -0
  34. package/dist/components/FileUpload/FileUpload.js +116 -0
  35. package/dist/components/FileUpload/FileUpload.js.map +1 -0
  36. package/dist/components/FileUpload/FileUpload.stories.d.ts +10 -0
  37. package/dist/components/Footer/Footer.js +54 -0
  38. package/dist/components/Footer/Footer.js.map +1 -0
  39. package/dist/components/Header/Header.js +114 -0
  40. package/dist/components/Header/Header.js.map +1 -0
  41. package/dist/components/Input/Input.d.ts +2 -2
  42. package/dist/components/Input/Input.js +78 -0
  43. package/dist/components/Input/Input.js.map +1 -0
  44. package/dist/components/Input/Input.stories.d.ts +9 -0
  45. package/dist/components/Layout/Layout.js +41 -0
  46. package/dist/components/Layout/Layout.js.map +1 -0
  47. package/dist/components/Modal/Modal.js +113 -0
  48. package/dist/components/Modal/Modal.js.map +1 -0
  49. package/dist/components/Modal/Modal.stories.d.ts +8 -0
  50. package/dist/components/Navigation/Navigation.js +26 -0
  51. package/dist/components/Navigation/Navigation.js.map +1 -0
  52. package/dist/components/NumberInput/NumberInput.d.ts +12 -0
  53. package/dist/components/NumberInput/NumberInput.js +135 -0
  54. package/dist/components/NumberInput/NumberInput.js.map +1 -0
  55. package/dist/components/NumberInput/NumberInput.stories.d.ts +8 -0
  56. package/dist/components/PageHeader/PageHeader.js +29 -0
  57. package/dist/components/PageHeader/PageHeader.js.map +1 -0
  58. package/dist/components/Pagination/Pagination.js +50 -0
  59. package/dist/components/Pagination/Pagination.js.map +1 -0
  60. package/dist/components/Pagination/Pagination.stories.d.ts +8 -0
  61. package/dist/components/Paragraph/Paragraph.js +41 -0
  62. package/dist/components/Paragraph/Paragraph.js.map +1 -0
  63. package/dist/components/Popover/Popover.js +57 -0
  64. package/dist/components/Popover/Popover.js.map +1 -0
  65. package/dist/components/Radio/Radio.d.ts +2 -2
  66. package/dist/components/Radio/Radio.js +36 -0
  67. package/dist/components/Radio/Radio.js.map +1 -0
  68. package/dist/components/Radio/Radio.stories.d.ts +7 -0
  69. package/dist/components/SectionHeader/SectionHeader.js +19 -0
  70. package/dist/components/SectionHeader/SectionHeader.js.map +1 -0
  71. package/dist/components/Select/Select.d.ts +2 -2
  72. package/dist/components/Select/Select.js +45 -0
  73. package/dist/components/Select/Select.js.map +1 -0
  74. package/dist/components/Select/Select.stories.d.ts +8 -0
  75. package/dist/components/Skeleton/Skeleton.js +25 -0
  76. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  77. package/dist/components/Stepper/Stepper.d.ts +13 -0
  78. package/dist/components/Stepper/Stepper.js +97 -0
  79. package/dist/components/Stepper/Stepper.js.map +1 -0
  80. package/dist/components/Stepper/Stepper.stories.d.ts +8 -0
  81. package/dist/components/Subtitle/Subtitle.js +40 -0
  82. package/dist/components/Subtitle/Subtitle.js.map +1 -0
  83. package/dist/components/Switch/Switch.d.ts +2 -2
  84. package/dist/components/Switch/Switch.js +37 -0
  85. package/dist/components/Switch/Switch.js.map +1 -0
  86. package/dist/components/Switch/Switch.stories.d.ts +8 -0
  87. package/dist/components/Table/Table.js +17 -0
  88. package/dist/components/Table/Table.js.map +1 -0
  89. package/dist/components/Tabs/Tabs.js +62 -0
  90. package/dist/components/Tabs/Tabs.js.map +1 -0
  91. package/dist/components/Tabs/Tabs.stories.d.ts +8 -0
  92. package/dist/components/Tag/Tag.js +29 -0
  93. package/dist/components/Tag/Tag.js.map +1 -0
  94. package/dist/components/Textarea/Textarea.d.ts +2 -2
  95. package/dist/components/Textarea/Textarea.js +46 -0
  96. package/dist/components/Textarea/Textarea.js.map +1 -0
  97. package/dist/components/Textarea/Textarea.stories.d.ts +7 -0
  98. package/dist/components/Title/Title.js +47 -0
  99. package/dist/components/Title/Title.js.map +1 -0
  100. package/dist/components/Toast/Toast.js +110 -0
  101. package/dist/components/Toast/Toast.js.map +1 -0
  102. package/dist/components/Toast/Toast.stories.d.ts +8 -0
  103. package/dist/components/Tooltip/Tooltip.js +36 -0
  104. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  105. package/dist/index.d.ts +10 -5
  106. package/dist/index.js +88 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/node_modules/clsx/dist/clsx.js +17 -0
  109. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  110. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +2925 -0
  111. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  112. package/dist/oficios-ui.umd.cjs +1 -1
  113. package/dist/oficios-ui.umd.cjs.map +1 -1
  114. package/dist/theme/ThemeProvider.d.ts +1 -1
  115. package/dist/theme/ThemeProvider.js +22 -0
  116. package/dist/theme/ThemeProvider.js.map +1 -0
  117. package/dist/theme.css +54 -64
  118. package/dist/ui.css +1 -0
  119. package/dist/utils/cn.d.ts +7 -1
  120. package/dist/utils/cn.js +7 -0
  121. package/dist/utils/cn.js.map +1 -0
  122. package/package.json +42 -9
  123. package/dist/oficios-ui.css +0 -1
  124. package/dist/oficios-ui.js +0 -1386
  125. package/dist/oficios-ui.js.map +0 -1
@@ -0,0 +1,56 @@
1
+ import { jsx as l, jsxs as p } from "react/jsx-runtime";
2
+ import { useState as h, useRef as v } from "react";
3
+ import { cn as w } from "../../utils/cn.js";
4
+ const A = ({ items: g, defaultOpenId: b }) => {
5
+ const [x, y] = h(b ?? null), o = v(null);
6
+ return /* @__PURE__ */ l("div", { className: "grid gap-2", ref: o, children: g.map((t) => {
7
+ const n = x === t.id, d = `accordion-trigger-${t.id}`, i = `accordion-panel-${t.id}`;
8
+ return /* @__PURE__ */ p(
9
+ "div",
10
+ {
11
+ className: "overflow-hidden rounded-[var(--border-radius-md)] border border-[var(--border-color)]",
12
+ children: [
13
+ /* @__PURE__ */ p(
14
+ "button",
15
+ {
16
+ "aria-controls": i,
17
+ "aria-expanded": n,
18
+ className: "flex w-full items-center justify-between bg-[var(--bg-secondary)] px-4 py-3 text-left text-sm font-medium text-[var(--text-primary)] hover:bg-[var(--bg-hover)]",
19
+ id: d,
20
+ onKeyDown: (r) => {
21
+ var s, c, u, f;
22
+ if (!o.current)
23
+ return;
24
+ const e = Array.from(
25
+ o.current.querySelectorAll('[id^="accordion-trigger-"]')
26
+ ), a = e.findIndex((m) => m.id === d);
27
+ a === -1 || e.length === 0 || (r.key === "ArrowDown" ? (r.preventDefault(), (s = e[(a + 1) % e.length]) == null || s.focus()) : r.key === "ArrowUp" ? (r.preventDefault(), (c = e[(a - 1 + e.length) % e.length]) == null || c.focus()) : r.key === "Home" ? (r.preventDefault(), (u = e[0]) == null || u.focus()) : r.key === "End" && (r.preventDefault(), (f = e[e.length - 1]) == null || f.focus()));
28
+ },
29
+ onClick: () => y((r) => r === t.id ? null : t.id),
30
+ type: "button",
31
+ children: [
32
+ t.title,
33
+ /* @__PURE__ */ l("span", { className: w("transition", n ? "rotate-180" : ""), children: "⌄" })
34
+ ]
35
+ }
36
+ ),
37
+ n && /* @__PURE__ */ l(
38
+ "div",
39
+ {
40
+ "aria-labelledby": d,
41
+ className: "bg-[var(--bg-tertiary)] px-4 py-3 text-sm text-[var(--text-secondary)]",
42
+ id: i,
43
+ role: "region",
44
+ children: t.content
45
+ }
46
+ )
47
+ ]
48
+ },
49
+ t.id
50
+ );
51
+ }) });
52
+ };
53
+ export {
54
+ A as Accordion
55
+ };
56
+ //# sourceMappingURL=Accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import type React from 'react';\nimport { useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface AccordionItem {\n content: React.ReactNode;\n id: string;\n title: React.ReactNode;\n}\n\nexport interface AccordionProps {\n defaultOpenId?: string;\n items: AccordionItem[];\n}\n\nexport const Accordion: React.FC<AccordionProps> = ({ items, defaultOpenId }) => {\n const [openId, setOpenId] = useState<string | null>(defaultOpenId ?? null);\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n return (\n <div className=\"grid gap-2\" ref={rootRef}>\n {items.map((item) => {\n const isOpen = openId === item.id;\n const triggerId = `accordion-trigger-${item.id}`;\n const panelId = `accordion-panel-${item.id}`;\n return (\n <div\n className=\"overflow-hidden rounded-[var(--border-radius-md)] border border-[var(--border-color)]\"\n key={item.id}\n >\n <button\n aria-controls={panelId}\n aria-expanded={isOpen}\n className=\"flex w-full items-center justify-between bg-[var(--bg-secondary)] px-4 py-3 text-left text-sm font-medium text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\n id={triggerId}\n onKeyDown={(event) => {\n if (!rootRef.current) {\n return;\n }\n const buttons = Array.from(\n rootRef.current.querySelectorAll<HTMLButtonElement>('[id^=\"accordion-trigger-\"]'),\n );\n const currentIndex = buttons.findIndex((btn) => btn.id === triggerId);\n if (currentIndex === -1 || buttons.length === 0) {\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n buttons[(currentIndex + 1) % buttons.length]?.focus();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n buttons[(currentIndex - 1 + buttons.length) % buttons.length]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n buttons[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n buttons[buttons.length - 1]?.focus();\n }\n }}\n onClick={() => setOpenId((prev) => (prev === item.id ? null : item.id))}\n type=\"button\"\n >\n {item.title}\n <span className={cn('transition', isOpen ? 'rotate-180' : '')}>⌄</span>\n </button>\n {isOpen && (\n <div\n aria-labelledby={triggerId}\n className=\"bg-[var(--bg-tertiary)] px-4 py-3 text-sm text-[var(--text-secondary)]\"\n id={panelId}\n role=\"region\"\n >\n {item.content}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":["Accordion","items","defaultOpenId","openId","setOpenId","useState","rootRef","useRef","jsx","item","isOpen","triggerId","panelId","jsxs","event","buttons","currentIndex","btn","_a","_b","_c","_d","prev","cn"],"mappings":";;;AAeO,MAAMA,IAAsC,CAAC,EAAE,OAAAC,GAAO,eAAAC,QAAoB;AAC/E,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAwBH,KAAiB,IAAI,GACnEI,IAAUC,EAA8B,IAAI;AAElD,SACE,gBAAAC,EAAC,SAAI,WAAU,cAAa,KAAKF,GAC9B,UAAAL,EAAM,IAAI,CAACQ,MAAS;AACnB,UAAMC,IAASP,MAAWM,EAAK,IACzBE,IAAY,qBAAqBF,EAAK,EAAE,IACxCG,IAAU,mBAAmBH,EAAK,EAAE;AAC1C,WACE,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QAGV,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,iBAAeD;AAAA,cACf,iBAAeF;AAAA,cACf,WAAU;AAAA,cACV,IAAIC;AAAA,cACJ,WAAW,CAACG,MAAU;;AACpB,oBAAI,CAACR,EAAQ;AACX;AAEF,sBAAMS,IAAU,MAAM;AAAA,kBACpBT,EAAQ,QAAQ,iBAAoC,4BAA4B;AAAA,gBAAA,GAE5EU,IAAeD,EAAQ,UAAU,CAACE,MAAQA,EAAI,OAAON,CAAS;AACpE,gBAAIK,MAAiB,MAAMD,EAAQ,WAAW,MAG1CD,EAAM,QAAQ,eAChBA,EAAM,eAAA,IACNI,IAAAH,GAASC,IAAe,KAAKD,EAAQ,MAAM,MAA3C,QAAAG,EAA8C,WACrCJ,EAAM,QAAQ,aACvBA,EAAM,eAAA,IACNK,IAAAJ,GAASC,IAAe,IAAID,EAAQ,UAAUA,EAAQ,MAAM,MAA5D,QAAAI,EAA+D,WACtDL,EAAM,QAAQ,UACvBA,EAAM,eAAA,IACNM,IAAAL,EAAQ,CAAC,MAAT,QAAAK,EAAY,WACHN,EAAM,QAAQ,UACvBA,EAAM,eAAA,IACNO,IAAAN,EAAQA,EAAQ,SAAS,CAAC,MAA1B,QAAAM,EAA6B;AAAA,cAEjC;AAAA,cACA,SAAS,MAAMjB,EAAU,CAACkB,MAAUA,MAASb,EAAK,KAAK,OAAOA,EAAK,EAAG;AAAA,cACtE,MAAK;AAAA,cAEJ,UAAA;AAAA,gBAAAA,EAAK;AAAA,gBACN,gBAAAD,EAAC,UAAK,WAAWe,EAAG,cAAcb,IAAS,eAAe,EAAE,GAAG,UAAA,IAAA,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEjEA,KACC,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,mBAAiBG;AAAA,cACjB,WAAU;AAAA,cACV,IAAIC;AAAA,cACJ,MAAK;AAAA,cAEJ,UAAAH,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QACR;AAAA,MAAA;AAAA,MA9CGA,EAAK;AAAA,IAAA;AAAA,EAkDhB,CAAC,EAAA,CACH;AAEJ;"}
@@ -0,0 +1,7 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Accordion } from './Accordion';
3
+ declare const meta: Meta<typeof Accordion>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Accordion>;
6
+ export declare const Playground: Story;
7
+ export declare const DefaultOpen: Story;
@@ -0,0 +1,32 @@
1
+ import { jsxs as n, jsx as e } from "react/jsx-runtime";
2
+ import { cn as d } from "../../utils/cn.js";
3
+ const l = ({
4
+ title: r,
5
+ tone: o = "info",
6
+ children: a,
7
+ className: t,
8
+ ...s
9
+ }) => {
10
+ const c = {
11
+ info: "border-[var(--info-color)]/40 bg-[var(--info-color)]/10 text-[var(--text-primary)]",
12
+ success: "border-[var(--success-color)]/40 bg-[var(--success-color)]/10 text-[var(--text-primary)]",
13
+ warning: "border-[var(--warning-color)]/40 bg-[var(--warning-color)]/10 text-[var(--text-primary)]",
14
+ error: "border-[var(--md-error)]/40 bg-[var(--md-error)]/10 text-[var(--text-primary)]"
15
+ }[o];
16
+ return /* @__PURE__ */ n(
17
+ "div",
18
+ {
19
+ className: d("rounded-[var(--border-radius-md)] border p-4", c, t),
20
+ role: "alert",
21
+ ...s,
22
+ children: [
23
+ r && /* @__PURE__ */ e("p", { className: "mb-1 text-sm font-semibold", children: r }),
24
+ /* @__PURE__ */ e("div", { className: "text-sm leading-relaxed", children: a })
25
+ ]
26
+ }
27
+ );
28
+ };
29
+ export {
30
+ l as Alert
31
+ };
32
+ //# sourceMappingURL=Alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.js","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n tone?: 'info' | 'success' | 'warning' | 'error';\n}\n\nexport const Alert: React.FC<AlertProps> = ({\n title,\n tone = 'info',\n children,\n className,\n ...props\n}) => {\n const toneClass = {\n info: 'border-[var(--info-color)]/40 bg-[var(--info-color)]/10 text-[var(--text-primary)]',\n success:\n 'border-[var(--success-color)]/40 bg-[var(--success-color)]/10 text-[var(--text-primary)]',\n warning:\n 'border-[var(--warning-color)]/40 bg-[var(--warning-color)]/10 text-[var(--text-primary)]',\n error: 'border-[var(--md-error)]/40 bg-[var(--md-error)]/10 text-[var(--text-primary)]',\n }[tone];\n\n return (\n <div\n className={cn('rounded-[var(--border-radius-md)] border p-4', toneClass, className)}\n role=\"alert\"\n {...props}\n >\n {title && <p className=\"mb-1 text-sm font-semibold\">{title}</p>}\n <div className=\"text-sm leading-relaxed\">{children}</div>\n </div>\n );\n};\n"],"names":["Alert","title","tone","children","className","props","toneClass","jsxs","cn","jsx"],"mappings":";;AAQO,MAAMA,IAA8B,CAAC;AAAA,EAC1C,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAY;AAAA,IAChB,MAAM;AAAA,IACN,SACE;AAAA,IACF,SACE;AAAA,IACF,OAAO;AAAA,EAAA,EACPJ,CAAI;AAEN,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,gDAAgDF,GAAWF,CAAS;AAAA,MAClF,MAAK;AAAA,MACJ,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAJ,KAAS,gBAAAQ,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAAR,GAAM;AAAA,QAC3D,gBAAAQ,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAN,EAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGzD;"}
@@ -0,0 +1,8 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Alert } from './Alert';
3
+ declare const meta: Meta<typeof Alert>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Alert>;
6
+ export declare const Playground: Story;
7
+ export declare const AllTones: Story;
8
+ export declare const WithoutTitle: Story;
@@ -0,0 +1,35 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import { cn as i } from "../../utils/cn.js";
3
+ const l = ({
4
+ size: r = "md",
5
+ tone: e = "neutral",
6
+ className: t,
7
+ children: a,
8
+ ...n
9
+ }) => {
10
+ const o = {
11
+ neutral: "bg-[var(--bg-tertiary)] text-[var(--text-secondary)]",
12
+ primary: "bg-[var(--md-primary)] text-[var(--md-on-primary)]",
13
+ success: "bg-[var(--success-color)] text-white",
14
+ warning: "bg-[var(--warning-color)] text-white",
15
+ error: "bg-[var(--md-error)] text-[var(--md-on-error)]",
16
+ info: "bg-[var(--info-color)] text-white"
17
+ }[e];
18
+ return /* @__PURE__ */ s(
19
+ "span",
20
+ {
21
+ className: i(
22
+ "inline-flex items-center rounded-full font-medium leading-none",
23
+ o,
24
+ r === "sm" ? "px-2 py-0.5 text-[0.6875rem]" : "px-2.5 py-1 text-xs",
25
+ t
26
+ ),
27
+ ...n,
28
+ children: a
29
+ }
30
+ );
31
+ };
32
+ export {
33
+ l as Badge
34
+ };
35
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'sm' | 'md';\n tone?: 'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info';\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n size = 'md',\n tone = 'neutral',\n className,\n children,\n ...props\n}) => {\n const toneClass = {\n neutral: 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]',\n primary: 'bg-[var(--md-primary)] text-[var(--md-on-primary)]',\n success: 'bg-[var(--success-color)] text-white',\n warning: 'bg-[var(--warning-color)] text-white',\n error: 'bg-[var(--md-error)] text-[var(--md-on-error)]',\n info: 'bg-[var(--info-color)] text-white',\n }[tone];\n\n const sizeClass = size === 'sm' ? 'px-2 py-0.5 text-[0.6875rem]' : 'px-2.5 py-1 text-xs';\n\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full font-medium leading-none',\n toneClass,\n sizeClass,\n className,\n )}\n {...props}\n >\n {children}\n </span>\n );\n};\n"],"names":["Badge","size","tone","className","children","props","toneClass","jsx","cn"],"mappings":";;AAQO,MAAMA,IAA8B,CAAC;AAAA,EAC1C,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAY;AAAA,IAChB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,EACNJ,CAAI;AAIN,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,QANYL,MAAS,OAAO,iCAAiC;AAAA,QAQ7DE;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,8 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Badge } from './Badge';
3
+ declare const meta: Meta<typeof Badge>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Badge>;
6
+ export declare const Playground: Story;
7
+ export declare const AllTones: Story;
8
+ export declare const Sizes: Story;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface BreadcrumbItem {
3
+ href?: string;
4
+ label: React.ReactNode;
5
+ }
6
+ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {
7
+ items: BreadcrumbItem[];
8
+ separator?: React.ReactNode;
9
+ }
10
+ export declare const Breadcrumb: React.FC<BreadcrumbProps>;
@@ -0,0 +1,26 @@
1
+ import { jsx as e, jsxs as i } from "react/jsx-runtime";
2
+ import { cn as o } from "../../utils/cn.js";
3
+ const m = ({
4
+ items: l,
5
+ separator: s = "/",
6
+ className: t,
7
+ ...c
8
+ }) => /* @__PURE__ */ e("nav", { "aria-label": "Breadcrumb", className: o("flex items-center", t), ...c, children: /* @__PURE__ */ e("ol", { className: "flex flex-wrap items-center gap-1 text-sm", children: l.map((r, a) => {
9
+ const n = a === l.length - 1;
10
+ return /* @__PURE__ */ i("li", { className: "flex items-center gap-1", children: [
11
+ a > 0 && /* @__PURE__ */ e("span", { "aria-hidden": "true", className: "select-none text-[var(--text-muted)]", children: s }),
12
+ n ? /* @__PURE__ */ e("span", { "aria-current": "page", className: "font-medium text-[var(--text-primary)]", children: r.label }) : r.href ? /* @__PURE__ */ e(
13
+ "a",
14
+ {
15
+ className: "text-[var(--md-primary)] transition hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-color-focus)]",
16
+ href: r.href,
17
+ children: r.label
18
+ }
19
+ ) : /* @__PURE__ */ e("span", { className: "text-[var(--text-secondary)]", children: r.label })
20
+ ] }, a);
21
+ }) }) });
22
+ m.displayName = "Breadcrumb";
23
+ export {
24
+ m as Breadcrumb
25
+ };
26
+ //# sourceMappingURL=Breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface BreadcrumbItem {\n href?: string;\n label: React.ReactNode;\n}\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\n items,\n separator = '/',\n className,\n ...props\n}) => {\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center', className)} {...props}>\n <ol className=\"flex flex-wrap items-center gap-1 text-sm\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"flex items-center gap-1\">\n {index > 0 && (\n <span aria-hidden=\"true\" className=\"select-none text-[var(--text-muted)]\">\n {separator}\n </span>\n )}\n {isLast ? (\n <span aria-current=\"page\" className=\"font-medium text-[var(--text-primary)]\">\n {item.label}\n </span>\n ) : item.href ? (\n <a\n className=\"text-[var(--md-primary)] transition hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-color-focus)]\"\n href={item.href}\n >\n {item.label}\n </a>\n ) : (\n <span className=\"text-[var(--text-secondary)]\">{item.label}</span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nBreadcrumb.displayName = 'Breadcrumb';\n"],"names":["Breadcrumb","items","separator","className","props","cn","jsx","item","index","isLast","jsxs"],"mappings":";;AAaO,MAAMA,IAAwC,CAAC;AAAA,EACpD,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,wBAEK,OAAA,EAAI,cAAW,cAAa,WAAWC,EAAG,qBAAqBF,CAAS,GAAI,GAAGC,GAC9E,UAAA,gBAAAE,EAAC,QAAG,WAAU,6CACX,YAAM,IAAI,CAACC,GAAMC,MAAU;AAC1B,QAAMC,IAASD,MAAUP,EAAM,SAAS;AACxC,SACE,gBAAAS,EAAC,MAAA,EAAe,WAAU,2BACvB,UAAA;AAAA,IAAAF,IAAQ,KACP,gBAAAF,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,wCAChC,UAAAJ,EAAA,CACH;AAAA,IAEDO,IACC,gBAAAH,EAAC,QAAA,EAAK,gBAAa,QAAO,WAAU,0CACjC,UAAAC,EAAK,MAAA,CACR,IACEA,EAAK,OACP,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAMC,EAAK;AAAA,QAEV,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,IAGR,gBAAAD,EAAC,QAAA,EAAK,WAAU,gCAAgC,YAAK,MAAA,CAAM;AAAA,EAAA,EAAA,GAlBtDE,CAoBT;AAEJ,CAAC,GACH,GACF;AAIJR,EAAW,cAAc;"}
@@ -0,0 +1,8 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Breadcrumb } from './Breadcrumb';
3
+ declare const meta: Meta<typeof Breadcrumb>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Breadcrumb>;
6
+ export declare const Playground: Story;
7
+ export declare const WithCustomSeparator: Story;
8
+ export declare const TwoLevels: Story;
@@ -0,0 +1,122 @@
1
+ import { jsxs as h, jsx as a } from "react/jsx-runtime";
2
+ import { cn as N } from "../../utils/cn.js";
3
+ const P = ({
4
+ variant: i = "primary",
5
+ size: t = "md",
6
+ compact: r = !1,
7
+ fullWidth: l = !1,
8
+ isLoading: o = !1,
9
+ leftIcon: d,
10
+ rightIcon: v,
11
+ children: c,
12
+ className: p = "",
13
+ disabled: w,
14
+ palette: e,
15
+ style: b,
16
+ ...f
17
+ }) => {
18
+ const y = "relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap rounded-[var(--border-radius-md)] border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]", x = "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]", g = "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60", u = l ? "w-full" : "", z = e === "off-white" && i === "primary" ? "border-[var(--border-color)]" : "", C = {
19
+ xs: r ? "min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]" : "min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]",
20
+ sm: r ? "min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]" : "min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]",
21
+ md: r ? "min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]" : "min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]",
22
+ lg: r ? "min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]" : "min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]",
23
+ xl: r ? "min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]" : "min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]"
24
+ }, j = {
25
+ primary: "bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]",
26
+ secondary: "bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]",
27
+ success: "bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]",
28
+ error: "bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]",
29
+ warning: "bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]",
30
+ info: "bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]",
31
+ neutral: "bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]",
32
+ ghost: "border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--md-on-surface)] shadow-[var(--shadow-xs)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]"
33
+ }, m = {
34
+ xs: r ? "h-3 w-3" : "h-3.5 w-3.5",
35
+ sm: r ? "h-3.5 w-3.5" : "h-4 w-4",
36
+ md: "h-[1.125rem] w-[1.125rem]",
37
+ lg: "h-5 w-5",
38
+ xl: "h-5 w-5"
39
+ }, n = {
40
+ "verde-vibrante": {
41
+ primary: "var(--brand-verde-vibrante)",
42
+ hover: "var(--brand-verde-profundo)"
43
+ },
44
+ "verde-profundo": {
45
+ primary: "var(--brand-verde-profundo)",
46
+ hover: "var(--brand-grafite-azulado)"
47
+ },
48
+ "grafite-azulado": {
49
+ primary: "var(--brand-grafite-azulado)",
50
+ hover: "var(--brand-cinza-escuro)"
51
+ },
52
+ "azul-acinzentado": {
53
+ primary: "var(--brand-azul-acinzentado)",
54
+ hover: "var(--brand-grafite-azulado)"
55
+ },
56
+ "cinza-medio": {
57
+ primary: "var(--brand-cinza-medio)",
58
+ hover: "var(--brand-cinza-escuro)"
59
+ },
60
+ "cinza-escuro": {
61
+ primary: "var(--brand-cinza-escuro)",
62
+ hover: "var(--brand-preto)"
63
+ },
64
+ "off-white": {
65
+ primary: "var(--brand-off-white)",
66
+ hover: "var(--brand-branco)",
67
+ onPrimary: "var(--brand-grafite-azulado)"
68
+ }
69
+ }, s = {};
70
+ e && i === "primary" && (s["--md-primary"] = n[e].primary, s["--primary-color-hover"] = n[e].hover, n[e].onPrimary && (s["--md-on-primary"] = n[e].onPrimary));
71
+ const k = N(
72
+ y,
73
+ x,
74
+ g,
75
+ C[t],
76
+ j[i],
77
+ z,
78
+ u,
79
+ p
80
+ );
81
+ return /* @__PURE__ */ h(
82
+ "button",
83
+ {
84
+ className: k,
85
+ disabled: w || o,
86
+ style: { ...s, ...b },
87
+ ...f,
88
+ children: [
89
+ o && /* @__PURE__ */ a(
90
+ "span",
91
+ {
92
+ "aria-hidden": "true",
93
+ className: "absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center",
94
+ children: /* @__PURE__ */ h("svg", { fill: "none", stroke: "currentColor", strokeWidth: "2", viewBox: "0 0 24 24", children: [
95
+ /* @__PURE__ */ a("circle", { cx: "12", cy: "12", r: "10", strokeOpacity: "0.25" }),
96
+ /* @__PURE__ */ a("path", { d: "M12 2 A10 10 0 0 1 22 12", strokeLinecap: "round" })
97
+ ] })
98
+ }
99
+ ),
100
+ !o && d && /* @__PURE__ */ a(
101
+ "span",
102
+ {
103
+ className: `mr-1 inline-flex shrink-0 items-center justify-center leading-none ${m[t]}`,
104
+ children: d
105
+ }
106
+ ),
107
+ !o && /* @__PURE__ */ a("span", { className: "btn__content inline-flex items-center justify-center", children: c }),
108
+ !o && v && /* @__PURE__ */ a(
109
+ "span",
110
+ {
111
+ className: `ml-1 inline-flex shrink-0 items-center justify-center leading-none ${m[t]}`,
112
+ children: v
113
+ }
114
+ )
115
+ ]
116
+ }
117
+ );
118
+ };
119
+ export {
120
+ P as Button
121
+ };
122
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import type React from 'react';\nimport type { CSSProperties } from 'react';\nimport { cn } from '../../utils/cn';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n compact?: boolean;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n compact = false,\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n style,\n ...props\n}) => {\n const baseClass =\n 'relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap rounded-[var(--border-radius-md)] border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]';\n const focusClass =\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]';\n const disabledClass =\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60';\n const fullWidthClass = fullWidth ? 'w-full' : '';\n const offWhiteBorderClass =\n palette === 'off-white' && variant === 'primary' ? 'border-[var(--border-color)]' : '';\n\n const sizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact\n ? 'min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]'\n : 'min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]',\n sm: compact\n ? 'min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]'\n : 'min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]',\n md: compact\n ? 'min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]'\n : 'min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]',\n lg: compact\n ? 'min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]'\n : 'min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]',\n xl: compact\n ? 'min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]'\n : 'min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]',\n };\n\n const variantClassMap: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary:\n 'bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]',\n secondary:\n 'bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]',\n success:\n 'bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]',\n error:\n 'bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]',\n warning:\n 'bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]',\n info: 'bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]',\n neutral:\n 'bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]',\n ghost:\n 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--md-on-surface)] shadow-[var(--shadow-xs)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]',\n };\n\n const iconSizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact ? 'h-3 w-3' : 'h-3.5 w-3.5',\n sm: compact ? 'h-3.5 w-3.5' : 'h-4 w-4',\n md: 'h-[1.125rem] w-[1.125rem]',\n lg: 'h-5 w-5',\n xl: 'h-5 w-5',\n };\n\n const paletteVars: Record<ButtonPalette, { primary: string; hover: string; onPrimary?: string }> =\n {\n 'verde-vibrante': {\n primary: 'var(--brand-verde-vibrante)',\n hover: 'var(--brand-verde-profundo)',\n },\n 'verde-profundo': {\n primary: 'var(--brand-verde-profundo)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'grafite-azulado': {\n primary: 'var(--brand-grafite-azulado)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'azul-acinzentado': {\n primary: 'var(--brand-azul-acinzentado)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'cinza-medio': {\n primary: 'var(--brand-cinza-medio)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'cinza-escuro': {\n primary: 'var(--brand-cinza-escuro)',\n hover: 'var(--brand-preto)',\n },\n 'off-white': {\n primary: 'var(--brand-off-white)',\n hover: 'var(--brand-branco)',\n onPrimary: 'var(--brand-grafite-azulado)',\n },\n };\n\n type ButtonCssVars = CSSProperties & {\n '--md-primary'?: string;\n '--primary-color-hover'?: string;\n '--md-on-primary'?: string;\n };\n const paletteStyle: ButtonCssVars = {};\n if (palette && variant === 'primary') {\n paletteStyle['--md-primary'] = paletteVars[palette].primary;\n paletteStyle['--primary-color-hover'] = paletteVars[palette].hover;\n if (paletteVars[palette].onPrimary) {\n paletteStyle['--md-on-primary'] = paletteVars[palette].onPrimary;\n }\n }\n\n const combinedClass = cn(\n baseClass,\n focusClass,\n disabledClass,\n sizeClassMap[size],\n variantClassMap[variant],\n offWhiteBorderClass,\n fullWidthClass,\n className,\n );\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n style={{ ...paletteStyle, ...style }}\n {...props}\n >\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span\n className={`mr-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {leftIcon}\n </span>\n )}\n {!isLoading && (\n <span className=\"btn__content inline-flex items-center justify-center\">{children}</span>\n )}\n {!isLoading && rightIcon && (\n <span\n className={`ml-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {rightIcon}\n </span>\n )}\n </button>\n );\n};\n"],"names":["Button","variant","size","compact","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","style","props","baseClass","focusClass","disabledClass","fullWidthClass","offWhiteBorderClass","sizeClassMap","variantClassMap","iconSizeClassMap","paletteVars","paletteStyle","combinedClass","cn","jsxs","jsx"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { jsx as m } from "react/jsx-runtime";
2
+ const c = ({
3
+ variant: a = "default",
4
+ padding: r = "md",
5
+ hoverable: o = !1,
6
+ children: s,
7
+ className: d = "",
8
+ ...e
9
+ }) => {
10
+ const n = "relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]", l = {
11
+ default: "bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]",
12
+ elevated: "bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]",
13
+ outlined: "bg-transparent border border-[var(--md-outline-variant)] shadow-none",
14
+ flat: "bg-[var(--md-surface)] border-0 shadow-none"
15
+ }, t = {
16
+ none: "p-0",
17
+ sm: "p-[var(--spacing-md)]",
18
+ md: "p-[var(--spacing-lg)]",
19
+ lg: "p-[var(--spacing-xl)]",
20
+ xl: "p-[var(--spacing-2xl)]"
21
+ }, i = o ? "hover:shadow-[var(--shadow-md)]" : "", v = [
22
+ n,
23
+ l[a],
24
+ t[r],
25
+ i,
26
+ d
27
+ ].filter(Boolean).join(" ");
28
+ return /* @__PURE__ */ m("div", { className: v, ...e, children: s });
29
+ };
30
+ export {
31
+ c as Card
32
+ };
33
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import type React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass =\n 'relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]';\n const variantClassMap: Record<NonNullable<CardProps['variant']>, string> = {\n default:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]',\n elevated:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]',\n outlined: 'bg-transparent border border-[var(--md-outline-variant)] shadow-none',\n flat: 'bg-[var(--md-surface)] border-0 shadow-none',\n };\n const paddingClassMap: Record<NonNullable<CardProps['padding']>, string> = {\n none: 'p-0',\n sm: 'p-[var(--spacing-md)]',\n md: 'p-[var(--spacing-lg)]',\n lg: 'p-[var(--spacing-xl)]',\n xl: 'p-[var(--spacing-2xl)]',\n };\n const hoverableClass = hoverable ? 'hover:shadow-[var(--shadow-md)]' : '';\n const combinedClass = [\n baseClass,\n variantClassMap[variant],\n paddingClassMap[padding],\n hoverableClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n"],"names":["Card","variant","padding","hoverable","children","className","props","baseClass","variantClassMap","paddingClassMap","hoverableClass","combinedClass"],"mappings":";AASO,MAAMA,IAA4B,CAAC;AAAA,EACxC,SAAAC,IAAU;AAAA,EACV,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IACJ,iGACIC,IAAqE;AAAA,IACzE,SACE;AAAA,IACF,UACE;AAAA,IACF,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,GAEFC,IAAqE;AAAA,IACzE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAEAC,IAAiBP,IAAY,oCAAoC,IACjEQ,IAAgB;AAAA,IACpBJ;AAAA,IACAC,EAAgBP,CAAO;AAAA,IACvBQ,EAAgBP,CAAO;AAAA,IACvBQ;AAAA,IACAL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACG,OAAA,EAAI,WAAWM,GAAgB,GAAGL,GAChC,UAAAF,GACH;AAEJ;"}
@@ -0,0 +1,8 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Card } from './Card';
3
+ declare const meta: Meta<typeof Card>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Card>;
6
+ export declare const Playground: Story;
7
+ export declare const Variants: Story;
8
+ export declare const Hoverable: Story;
@@ -1,6 +1,6 @@
1
- import type React from 'react';
1
+ import React from 'react';
2
2
  export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
3
  helperText?: string;
4
4
  label?: string;
5
5
  }
6
- export declare const Checkbox: React.FC<CheckboxProps>;
6
+ export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,36 @@
1
+ import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
+ import l from "react";
3
+ import { cn as m } from "../../utils/cn.js";
4
+ const d = l.forwardRef(
5
+ ({ label: t, helperText: r, className: i, id: a, ...c }, n) => {
6
+ const s = a || `checkbox-${Math.random().toString(36).slice(2, 9)}`;
7
+ return /* @__PURE__ */ o(
8
+ "label",
9
+ {
10
+ className: m("inline-flex cursor-pointer items-start gap-2", i),
11
+ htmlFor: s,
12
+ children: [
13
+ /* @__PURE__ */ e(
14
+ "input",
15
+ {
16
+ ref: n,
17
+ className: "mt-0.5 h-4 w-4 rounded border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]",
18
+ id: s,
19
+ type: "checkbox",
20
+ ...c
21
+ }
22
+ ),
23
+ /* @__PURE__ */ o("span", { className: "grid gap-0.5", children: [
24
+ t && /* @__PURE__ */ e("span", { className: "text-sm text-[var(--text-primary)]", children: t }),
25
+ r && /* @__PURE__ */ e("span", { className: "text-xs text-[var(--text-muted)]", children: r })
26
+ ] })
27
+ ]
28
+ }
29
+ );
30
+ }
31
+ );
32
+ d.displayName = "Checkbox";
33
+ export {
34
+ d as Checkbox
35
+ };
36
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n helperText?: string;\n label?: string;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, helperText, className, id, ...props }, ref) => {\n const inputId = id || `checkbox-${Math.random().toString(36).slice(2, 9)}`;\n\n return (\n <label\n className={cn('inline-flex cursor-pointer items-start gap-2', className)}\n htmlFor={inputId}\n >\n <input\n ref={ref}\n className=\"mt-0.5 h-4 w-4 rounded border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]\"\n id={inputId}\n type=\"checkbox\"\n {...props}\n />\n <span className=\"grid gap-0.5\">\n {label && <span className=\"text-sm text-[var(--text-primary)]\">{label}</span>}\n {helperText && <span className=\"text-xs text-[var(--text-muted)]\">{helperText}</span>}\n </span>\n </label>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["Checkbox","React","label","helperText","className","id","props","ref","inputId","jsxs","cn","jsx"],"mappings":";;;AAQO,MAAMA,IAAWC,EAAM;AAAA,EAC5B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,GAAGC,EAAA,GAASC,MAAQ;AACvD,UAAMC,IAAUH,KAAM,YAAY,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAExE,WACE,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAG,gDAAgDN,CAAS;AAAA,QACvE,SAASI;AAAA,QAET,UAAA;AAAA,UAAA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAJ;AAAA,cACA,WAAU;AAAA,cACV,IAAIC;AAAA,cACJ,MAAK;AAAA,cACJ,GAAGF;AAAA,YAAA;AAAA,UAAA;AAAA,UAEN,gBAAAG,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,YAAAP,KAAS,gBAAAS,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAT,GAAM;AAAA,YACrEC,KAAc,gBAAAQ,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAR,EAAA,CAAW;AAAA,UAAA,EAAA,CAChF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAH,EAAS,cAAc;"}
@@ -0,0 +1,7 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Checkbox } from './Checkbox';
3
+ declare const meta: Meta<typeof Checkbox>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Checkbox>;
6
+ export declare const Playground: Story;
7
+ export declare const States: Story;
@@ -0,0 +1,19 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { cn as n } from "../../utils/cn.js";
3
+ const b = ({ selected: r = !1, className: e, children: o, ...t }) => /* @__PURE__ */ a(
4
+ "button",
5
+ {
6
+ className: n(
7
+ "inline-flex items-center rounded-full border px-3 py-1.5 text-sm transition",
8
+ r ? "border-[var(--md-primary)] bg-[color:color-mix(in_srgb,var(--md-primary)_16%,transparent)] text-[var(--md-on-surface)]" : "border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]",
9
+ e
10
+ ),
11
+ type: "button",
12
+ ...t,
13
+ children: o
14
+ }
15
+ );
16
+ export {
17
+ b as Chip
18
+ };
19
+ //# sourceMappingURL=Chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip.js","sources":["../../../src/components/Chip/Chip.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface ChipProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n selected?: boolean;\n}\n\nexport const Chip: React.FC<ChipProps> = ({ selected = false, className, children, ...props }) => {\n return (\n <button\n className={cn(\n 'inline-flex items-center rounded-full border px-3 py-1.5 text-sm transition',\n selected\n ? 'border-[var(--md-primary)] bg-[color:color-mix(in_srgb,var(--md-primary)_16%,transparent)] text-[var(--md-on-surface)]'\n : 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]',\n className,\n )}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n );\n};\n"],"names":["Chip","selected","className","children","props","jsx","cn"],"mappings":";;AAOO,MAAMA,IAA4B,CAAC,EAAE,UAAAC,IAAW,IAAO,WAAAC,GAAW,UAAAC,GAAU,GAAGC,QAElF,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAL,IACI,2HACA;AAAA,MACJC;AAAA,IAAA;AAAA,IAEF,MAAK;AAAA,IACJ,GAAGE;AAAA,IAEH,UAAAD;AAAA,EAAA;AAAA;"}
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export interface ComboboxOption {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface ComboboxProps {
7
+ className?: string;
8
+ disabled?: boolean;
9
+ error?: string;
10
+ helperText?: string;
11
+ label?: string;
12
+ onChange?: (value: string) => void;
13
+ options: ComboboxOption[];
14
+ placeholder?: string;
15
+ value?: string;
16
+ }
17
+ export declare const Combobox: React.FC<ComboboxProps>;