@jiwambe/components 0.2.0 → 0.3.1

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.
package/README.md CHANGED
@@ -207,6 +207,35 @@ Single-expansion accordion with keyboard navigation.
207
207
  | `value` | `number` | — | Open item index (controlled). |
208
208
  | `onChange` | `(index: number) => void` | — | Called when the open item changes (controlled). |
209
209
 
210
+ ### FAQ
211
+
212
+ FAQ section with heading, accordion of question/answer pairs, and optional footer link. Supports single or multiple items open (controlled or uncontrolled) and full keyboard navigation. Layout and spacing match the Figma templates (xs+, lg+, xl+ breakpoints): fluid section padding, title-lg heading, title-md questions, text-md answers, and link-md footer link.
213
+
214
+ ```tsx
215
+ <FAQ
216
+ heading="Questions"
217
+ items={[
218
+ { question: 'What is X?', answer: 'X is...' },
219
+ { question: 'How do I Y?', answer: 'You can Y by...', disabled: true },
220
+ ]}
221
+ defaultOpenIndex={0}
222
+ link={{ label: 'View all FAQs', href: '/faq' }}
223
+ linkAs={NextLink}
224
+ />
225
+ ```
226
+
227
+ **Props:**
228
+
229
+ | Prop | Type | Default | Description |
230
+ | --- | --- | --- | --- |
231
+ | `heading` | `string` | `"FAQ"` | Section heading above the list. |
232
+ | `items` | `FAQItem[]` | — | Required. Array of `{ question, answer, disabled? }`. |
233
+ | `defaultOpenIndex` | `number \| number[]` | `[]` | Index(es) open by default (uncontrolled). |
234
+ | `value` | `number \| number[]` | — | Open index(es) (controlled). |
235
+ | `onChange` | `(indices: number[]) => void` | — | Called when open indices change (controlled). |
236
+ | `link` | `{ label: string; href: string }` | — | Optional footer link (e.g. "View all FAQs"). |
237
+ | `linkAs` | `ElementType` | `"a"` | Component for the footer link (e.g. `next/link`). |
238
+
210
239
  ### Tab
211
240
 
212
241
  Horizontal tabs with full ARIA support.
@@ -9,12 +9,12 @@ export interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onCha
9
9
  heading?: string;
10
10
  /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */
11
11
  items: FAQItem[];
12
- /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */
13
- defaultOpenIndex?: number;
14
- /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */
15
- value?: number;
16
- /** Called when the open index changes. @default undefined */
17
- onChange?: (index: number) => void;
12
+ /** Index(es) of the item(s) open by default (uncontrolled). @default [] */
13
+ defaultOpenIndex?: number | number[];
14
+ /** Currently open index(es) (controlled). @default undefined */
15
+ value?: number | number[];
16
+ /** Called when the open indices change. @default undefined */
17
+ onChange?: (indices: number[]) => void;
18
18
  /** Optional link rendered below the list (e.g. "View all FAQs"). @default undefined */
19
19
  link?: {
20
20
  label: string;
@@ -30,6 +30,11 @@ export interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onCha
30
30
  * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled
31
31
  * (defaultOpenIndex) expansion. Optional footer link for "View all FAQs" etc.
32
32
  *
33
+ * Layout and spacing match Figma templates across breakpoints:
34
+ * - xs+ (320px): section padding 16px/32px, heading ~25px, item padding 16px, list gap 8px.
35
+ * - lg+ (940px) / xl+ (1392px): section padding 32px/64px, heading 32px, item padding 32px, list gap 8px, content gap 24px.
36
+ * Uses design tokens: bg-fill-bg-secondary, bg-fill-action-inverse, text-title-lg (heading), text-title-md (question), text-text-md (answer), text-link-md (footer link), rad-md, fluid spacing.
37
+ *
33
38
  * @example
34
39
  * <FAQ heading="Questions" items={[{ question: 'What is X?', answer: 'X is...' }]} />
35
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqB3C;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACnF,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uFAAuF;IACvF,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,EAClB,OAAe,EACf,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAc,EACd,GAAG,EACH,GAAG,IAAI,EACR,EAAE,QAAQ,2CA6IV"}
1
+ {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqB3C;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACnF,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,uFAAuF;IACvF,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,GAAG,CAAC,EAClB,OAAe,EACf,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAc,EACd,GAAG,EACH,GAAG,IAAI,EACR,EAAE,QAAQ,2CAiJV"}
@@ -33,24 +33,26 @@ function FAQ({
33
33
  }) {
34
34
  const baseId = useId();
35
35
  const isControlled = value !== void 0;
36
- const [internalOpen, setInternalOpen] = useState(defaultOpenIndex ?? -1);
37
- const openIndex = isControlled ? value : internalOpen;
36
+ const controlledIndices = value !== void 0 ? Array.isArray(value) ? value : [value] : void 0;
37
+ const defaultIndices = defaultOpenIndex !== void 0 ? Array.isArray(defaultOpenIndex) ? defaultOpenIndex : [defaultOpenIndex] : [];
38
+ const [internalOpen, setInternalOpen] = useState(defaultIndices);
39
+ const openIndices = isControlled ? controlledIndices || [] : internalOpen;
38
40
  useEffect(() => {
39
41
  if (!isControlled && defaultOpenIndex !== void 0) {
40
- setInternalOpen(defaultOpenIndex);
42
+ setInternalOpen(defaultIndices);
41
43
  }
42
44
  }, [defaultOpenIndex, isControlled]);
43
45
  const triggerRefs = useRef([]);
44
46
  const toggle = useCallback(
45
47
  (index) => {
46
- const next = openIndex === index ? -1 : index;
48
+ const next = openIndices.includes(index) ? openIndices.filter((i) => i !== index) : [...openIndices, index];
47
49
  if (isControlled) {
48
50
  onChange == null ? void 0 : onChange(next);
49
51
  } else {
50
52
  setInternalOpen(next);
51
53
  }
52
54
  },
53
- [openIndex, isControlled, onChange]
55
+ [openIndices, isControlled, onChange]
54
56
  );
55
57
  const focusTrigger = (index) => {
56
58
  var _a;
@@ -92,7 +94,7 @@ function FAQ({
92
94
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-space-fluid-4-5", children: [
93
95
  heading && /* @__PURE__ */ jsx("h2", { className: "text-title-lg text-text-primary", children: heading }),
94
96
  /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-space-2", children: items.map((item, index) => {
95
- const isOpen = openIndex === index;
97
+ const isOpen = openIndices.includes(index);
96
98
  const triggerId = `${baseId}-faq-trigger-${index}`;
97
99
  const panelId = `${baseId}-faq-panel-${index}`;
98
100
  const disabled = !!item.disabled;
@@ -109,7 +111,7 @@ function FAQ({
109
111
  },
110
112
  id: triggerId,
111
113
  type: "button",
112
- className: `flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${disabled ? "text-text-disabled cursor-not-allowed" : "text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer"}`,
114
+ className: `flex w-full items-center justify-between gap-space-fluid-4-6 text-title-md text-left transition-colors outline-none ${disabled ? "text-text-disabled cursor-not-allowed" : "text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer"}`,
113
115
  "aria-expanded": isOpen,
114
116
  "aria-controls": panelId,
115
117
  "aria-disabled": disabled || void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"FAQ.js","sources":["../../../src/components/FAQ/FAQ.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useCallback, useId, useEffect } from 'react';\nimport type { FAQItem } from '../../types';\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n );\n}\n\n/**\n * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.\n * @see FAQItem\n */\nexport interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Section heading displayed above the accordion list. @default 'FAQ' */\n heading?: string;\n /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */\n items: FAQItem[];\n /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */\n defaultOpenIndex?: number;\n /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */\n value?: number;\n /** Called when the open index changes. @default undefined */\n onChange?: (index: number) => void;\n /** Optional link rendered below the list (e.g. \"View all FAQs\"). @default undefined */\n link?: {\n label: string;\n href: string;\n };\n /** Component to render the footer link as (e.g. next/link). @default 'a' */\n linkAs?: React.ElementType;\n /** Forwarded ref for the section. @default undefined */\n ref?: React.Ref<HTMLElement>;\n}\n\n/**\n * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape\n * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled\n * (defaultOpenIndex) expansion. Optional footer link for \"View all FAQs\" etc.\n *\n * @example\n * <FAQ heading=\"Questions\" items={[{ question: 'What is X?', answer: 'X is...' }]} />\n *\n * @example\n * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />\n */\nexport function FAQ({\n heading = 'FAQ',\n items,\n defaultOpenIndex,\n value,\n onChange,\n link,\n linkAs,\n className = '',\n ref,\n ...rest\n}: FAQProps) {\n const baseId = useId();\n const isControlled = value !== undefined;\n\n const [internalOpen, setInternalOpen] = useState<number>(defaultOpenIndex ?? -1);\n const openIndex = isControlled ? value : internalOpen;\n\n useEffect(() => {\n if (!isControlled && defaultOpenIndex !== undefined) {\n setInternalOpen(defaultOpenIndex);\n }\n }, [defaultOpenIndex, isControlled]);\n\n const triggerRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const toggle = useCallback(\n (index: number) => {\n const next = openIndex === index ? -1 : index;\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalOpen(next);\n }\n },\n [openIndex, isControlled, onChange],\n );\n\n const focusTrigger = (index: number) => {\n triggerRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabledIndices = items\n .map((_, i) => i)\n .filter((i) => !items[i].disabled);\n const currentPos = enabledIndices.indexOf(index);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);\n break;\n }\n case 'Home': {\n e.preventDefault();\n focusTrigger(enabledIndices[0]);\n break;\n }\n case 'End': {\n e.preventDefault();\n focusTrigger(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n }\n };\n\n return (\n <section\n ref={ref}\n className={`w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`}\n {...rest}\n >\n <div className=\"mx-auto w-full max-w-[1328px]\">\n <div className=\"flex flex-col gap-space-fluid-4-5\">\n {heading && (\n <h2 className=\"text-title-lg text-text-primary\">{heading}</h2>\n )}\n\n <div className=\"flex flex-col gap-space-2\">\n {items.map((item, index) => {\n const isOpen = openIndex === index;\n const triggerId = `${baseId}-faq-trigger-${index}`;\n const panelId = `${baseId}-faq-panel-${index}`;\n const disabled = !!item.disabled;\n\n return (\n <div\n key={index}\n className=\"flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8\"\n >\n <h3>\n <button\n ref={(el) => { triggerRefs.current[index] = el; }}\n id={triggerId}\n type=\"button\"\n className={`flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${\n disabled\n ? 'text-text-disabled cursor-not-allowed'\n : 'text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer'\n }`}\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n <span>{item.question}</span>\n <ChevronIcon\n className={`h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={`overflow-hidden transition-all duration-200 ease-in-out ${\n isOpen ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n }`}\n >\n <div className=\"text-text-md text-text-primary\">\n {item.answer}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {link && (\n <div className=\"mt-space-fluid-4-6\">\n {React.createElement(\n linkAs || 'a',\n {\n href: link.href,\n className: 'text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors',\n },\n link.label,\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;AAKA;AACE;AACE;AAAC;AAAA;AACC;AACM;AACC;AACC;AACH;AACE;AACK;AACE;AACC;AACH;AAEW;AAAA;AAG7B;AAuCO;AAAa;AACR;AACV;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AAEF;AACI;AACA;AAEA;AACA;AAEA;AACE;AACE;AAAgC;AAClC;AAGF;AAEA;AAAe;AAEX;AACA;AACE;AAAW;AAEX;AAAoB;AACtB;AACF;AACkC;AAGpC;;AACE;AAA4B;AAG9B;AACE;AAGA;AAEA;AAAU;AAEN;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAAA;AAIJ;AACE;AAAC;AAAA;AACC;AAC0F;AACtF;AAGF;AACG;AAC0D;AAKvD;AACA;AACA;AACA;AAEA;AACE;AAAC;AAAA;AAEW;AAEV;AACE;AAAC;AAAA;AACgB;AAA6B;AAAI;AAC5C;AACC;AAKL;AACe;AACA;AACY;AAC3B;AAC2B;AACa;AAExC;AAAqB;AACrB;AAAC;AAAA;AAC4F;AAAA;AAAA;AAC7F;AAAA;AAEJ;AACA;AAAC;AAAA;AACK;AACC;AACY;AAGjB;AAIA;AAAA;AAAA;AACF;AAAA;AArCK;AAAA;AAyCb;AACF;AAIW;AACK;AACV;AACa;AACA;AAAA;AAER;AAET;AAEJ;AAAA;AAGR;;;;"}
1
+ {"version":3,"file":"FAQ.js","sources":["../../../src/components/FAQ/FAQ.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useCallback, useId, useEffect } from 'react';\nimport type { FAQItem } from '../../types';\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n );\n}\n\n/**\n * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.\n * @see FAQItem\n */\nexport interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Section heading displayed above the accordion list. @default 'FAQ' */\n heading?: string;\n /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */\n items: FAQItem[];\n /** Index(es) of the item(s) open by default (uncontrolled). @default [] */\n defaultOpenIndex?: number | number[];\n /** Currently open index(es) (controlled). @default undefined */\n value?: number | number[];\n /** Called when the open indices change. @default undefined */\n onChange?: (indices: number[]) => void;\n /** Optional link rendered below the list (e.g. \"View all FAQs\"). @default undefined */\n link?: {\n label: string;\n href: string;\n };\n /** Component to render the footer link as (e.g. next/link). @default 'a' */\n linkAs?: React.ElementType;\n /** Forwarded ref for the section. @default undefined */\n ref?: React.Ref<HTMLElement>;\n}\n\n/**\n * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape\n * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled\n * (defaultOpenIndex) expansion. Optional footer link for \"View all FAQs\" etc.\n *\n * Layout and spacing match Figma templates across breakpoints:\n * - xs+ (320px): section padding 16px/32px, heading ~25px, item padding 16px, list gap 8px.\n * - lg+ (940px) / xl+ (1392px): section padding 32px/64px, heading 32px, item padding 32px, list gap 8px, content gap 24px.\n * Uses design tokens: bg-fill-bg-secondary, bg-fill-action-inverse, text-title-lg (heading), text-title-md (question), text-text-md (answer), text-link-md (footer link), rad-md, fluid spacing.\n *\n * @example\n * <FAQ heading=\"Questions\" items={[{ question: 'What is X?', answer: 'X is...' }]} />\n *\n * @example\n * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />\n */\nexport function FAQ({\n heading = 'FAQ',\n items,\n defaultOpenIndex,\n value,\n onChange,\n link,\n linkAs,\n className = '',\n ref,\n ...rest\n}: FAQProps) {\n const baseId = useId();\n const isControlled = value !== undefined;\n\n const controlledIndices = value !== undefined ? (Array.isArray(value) ? value : [value]) : undefined;\n const defaultIndices = defaultOpenIndex !== undefined ? (Array.isArray(defaultOpenIndex) ? defaultOpenIndex : [defaultOpenIndex]) : [];\n\n const [internalOpen, setInternalOpen] = useState<number[]>(defaultIndices);\n const openIndices = isControlled ? (controlledIndices || []) : internalOpen;\n\n useEffect(() => {\n if (!isControlled && defaultOpenIndex !== undefined) {\n setInternalOpen(defaultIndices);\n }\n }, [defaultOpenIndex, isControlled]);\n\n const triggerRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const toggle = useCallback(\n (index: number) => {\n const next = openIndices.includes(index)\n ? openIndices.filter((i) => i !== index)\n : [...openIndices, index];\n\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalOpen(next);\n }\n },\n [openIndices, isControlled, onChange],\n );\n\n const focusTrigger = (index: number) => {\n triggerRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabledIndices = items\n .map((_, i) => i)\n .filter((i) => !items[i].disabled);\n const currentPos = enabledIndices.indexOf(index);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);\n break;\n }\n case 'Home': {\n e.preventDefault();\n focusTrigger(enabledIndices[0]);\n break;\n }\n case 'End': {\n e.preventDefault();\n focusTrigger(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n }\n };\n\n return (\n <section\n ref={ref}\n className={`w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`}\n {...rest}\n >\n <div className=\"mx-auto w-full max-w-[1328px]\">\n <div className=\"flex flex-col gap-space-fluid-4-5\">\n {heading && (\n <h2 className=\"text-title-lg text-text-primary\">{heading}</h2>\n )}\n\n <div className=\"flex flex-col gap-space-2\">\n {items.map((item, index) => {\n const isOpen = openIndices.includes(index);\n const triggerId = `${baseId}-faq-trigger-${index}`;\n const panelId = `${baseId}-faq-panel-${index}`;\n const disabled = !!item.disabled;\n\n return (\n <div\n key={index}\n className=\"flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8\"\n >\n <h3>\n <button\n ref={(el) => { triggerRefs.current[index] = el; }}\n id={triggerId}\n type=\"button\"\n className={`flex w-full items-center justify-between gap-space-fluid-4-6 text-title-md text-left transition-colors outline-none ${disabled\n ? 'text-text-disabled cursor-not-allowed'\n : 'text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer'\n }`}\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n <span>{item.question}</span>\n <ChevronIcon\n className={`h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={`overflow-hidden transition-all duration-200 ease-in-out ${isOpen ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n }`}\n >\n <div className=\"text-text-md text-text-primary\">\n {item.answer}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {link && (\n <div className=\"mt-space-fluid-4-6\">\n {React.createElement(\n linkAs || 'a',\n {\n href: link.href,\n className: 'text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors',\n },\n link.label,\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;AAKA;AACE;AACE;AAAC;AAAA;AACC;AACM;AACC;AACC;AACH;AACE;AACK;AACE;AACC;AACH;AAEW;AAAA;AAG7B;AA4CO;AAAa;AACR;AACV;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AAEF;AACE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACE;AACE;AAA8B;AAChC;AAGF;AAEA;AAAe;AAEX;AAIA;AACE;AAAW;AAEX;AAAoB;AACtB;AACF;AACoC;AAGtC;;AACE;AAA4B;AAG9B;AACE;AAGA;AAEA;AAAU;AAEN;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAAA;AAIJ;AACE;AAAC;AAAA;AACC;AAC0F;AACtF;AAGF;AACG;AAC0D;AAKvD;AACA;AACA;AACA;AAEA;AACE;AAAC;AAAA;AAEW;AAEV;AACE;AAAC;AAAA;AACgB;AAA6B;AAAI;AAC5C;AACC;AAIH;AACa;AACA;AACY;AAC3B;AAC2B;AACa;AAExC;AAAqB;AACrB;AAAC;AAAA;AAC4F;AAAA;AAAA;AAC7F;AAAA;AAEJ;AACA;AAAC;AAAA;AACK;AACC;AACY;AAEf;AAIF;AAAA;AAAA;AACF;AAAA;AAnCK;AAAA;AAuCb;AACF;AAIW;AACK;AACV;AACa;AACA;AAAA;AAER;AAET;AAEJ;AAAA;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"jiwambe-plugin.d.ts","sourceRoot":"","sources":["../../src/plugin/jiwambe-plugin.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,uDAAuD;IACvD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAmGD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7D;AA2cD,QAAA,MAAM,aAAa;;;cAjlBD,CAAC;;;CAuwBlB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"jiwambe-plugin.d.ts","sourceRoot":"","sources":["../../src/plugin/jiwambe-plugin.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,uDAAuD;IACvD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAmGD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7D;AA2cD,QAAA,MAAM,aAAa;;;cAjlBD,CAAC;;;CAkxBlB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -190,7 +190,7 @@ const fontFamilySecondary = '"Inter", sans-serif';
190
190
  const typographyTokens = {
191
191
  "title-sm": {
192
192
  fontFamily: fontFamilyPrimary,
193
- fontSize: "1.0625rem",
193
+ fontSize: "clamp(0.9375rem, 0.8482rem + 0.4464vw, 1.0625rem)",
194
194
  fontWeight: "600",
195
195
  lineHeight: "1.2",
196
196
  letterSpacing: "-0.005em",
@@ -198,7 +198,7 @@ const typographyTokens = {
198
198
  },
199
199
  "title-md": {
200
200
  fontFamily: fontFamilyPrimary,
201
- fontSize: "1.1875rem",
201
+ fontSize: "clamp(1rem, 0.8661rem + 0.6696vw, 1.1875rem)",
202
202
  fontWeight: "600",
203
203
  lineHeight: "1.2",
204
204
  letterSpacing: "0.02em",
@@ -208,15 +208,15 @@ const typographyTokens = {
208
208
  fontFamily: fontFamilyPrimary,
209
209
  fontSize: "clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)",
210
210
  fontWeight: "600",
211
- lineHeight: "1.1",
211
+ lineHeight: "1.0",
212
212
  letterSpacing: "-0.005em",
213
213
  textWrap: "balance"
214
214
  },
215
215
  "title-xl": {
216
216
  fontFamily: fontFamilyPrimary,
217
217
  fontSize: "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
218
- fontWeight: "680",
219
- lineHeight: "1.1",
218
+ fontWeight: "800",
219
+ lineHeight: "1.0",
220
220
  letterSpacing: "-0.005em",
221
221
  textWrap: "balance"
222
222
  },
@@ -267,8 +267,8 @@ const typographyTokens = {
267
267
  "text-xl": {
268
268
  fontFamily: fontFamilyPrimary,
269
269
  fontSize: "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
270
- fontWeight: "680",
271
- lineHeight: "1.1",
270
+ fontWeight: "800",
271
+ lineHeight: "1.0",
272
272
  letterSpacing: "-0.005em",
273
273
  textWrap: "pretty"
274
274
  },
@@ -443,18 +443,18 @@ const canonicalTypographyPrimitives = {
443
443
  "font-size-fluid-48-60": "clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)",
444
444
  "font-family-primary": '"Instrument Sans", sans-serif',
445
445
  "font-family-secondary": "'Inter', system-ui, sans-serif",
446
- "font-size-a-sm": "1.0625rem",
447
- "font-size-a-md": "1.1875rem",
448
- "font-size-a-lg-fluid": "var(--font-size-fluid-25-32)",
449
- "font-size-a-xl-fluid": "var(--font-size-fluid-48-60)",
450
- "font-size-b-xs": "0.75rem",
451
- "font-size-b-sm": "1rem",
452
- "font-size-b-md": "1.125rem",
446
+ "font-size-s-sm": "1.0625rem",
447
+ "font-size-s-md": "1.1875rem",
448
+ "font-size-s-lg-fluid": "var(--font-size-fluid-25-32)",
449
+ "font-size-s-xl-fluid": "var(--font-size-fluid-48-60)",
450
+ "font-size-t-xs": "0.75rem",
451
+ "font-size-t-sm": "1rem",
452
+ "font-size-t-md": "1.125rem",
453
453
  "font-weight-xs": "400",
454
454
  "font-weight-sm": "500",
455
455
  "font-weight-md": "600",
456
- "font-weight-lg": "680",
457
- "font-line-tight": "1.1",
456
+ "font-weight-lg": "800",
457
+ "font-line-tight": "1.0",
458
458
  "font-line-normal": "1.2",
459
459
  "font-line-loose": "1.4",
460
460
  "font-ltrspc-xs": "-0.005em",
@@ -526,7 +526,18 @@ const jiwambePlugin = plugin.withOptions(
526
526
  for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {
527
527
  cssVars[`--${key}`] = value;
528
528
  }
529
- addBase({ ":root": cssVars });
529
+ addBase({
530
+ ":root": cssVars,
531
+ body: {
532
+ "text-rendering": "optimizeLegibility",
533
+ "-webkit-font-smoothing": "antialiased",
534
+ "-moz-osx-font-smoothing": "grayscale",
535
+ "text-size-adjust": "none",
536
+ "-webkit-text-size-adjust": "none",
537
+ "-moz-text-size-adjust": "none",
538
+ "font-optical-sizing": "auto"
539
+ }
540
+ });
530
541
  addBase({
531
542
  "@keyframes jiwambe-shimmer": {
532
543
  "0%": {
@@ -1 +1 @@
1
- {"version":3,"file":"jiwambe-plugin.js","sources":["../../src/plugin/jiwambe-plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TypographyDef {\n fontFamily: string;\n fontSize: string;\n fontWeight: string;\n lineHeight: string;\n letterSpacing?: string;\n textWrap?: string;\n}\n\nexport interface JiwambePluginOptions {\n /** Override or extend semantic color token mappings. */\n colors?: Record<string, string>;\n /** Override or extend spacing tokens. */\n spacing?: Record<string, string>;\n /** Override or extend border width tokens. */\n borderWidth?: Record<string, string>;\n /** Override or extend border radius tokens. */\n borderRadius?: Record<string, string>;\n /** Override or extend elevation (box-shadow) tokens. */\n elevation?: Record<string, string>;\n /** Override or extend typography definitions. Partial overrides are merged with defaults. */\n typography?: Record<string, Partial<TypographyDef>>;\n /** Override primary and/or secondary font families. */\n fontFamily?: { primary?: string; secondary?: string };\n}\n\n// ---------------------------------------------------------------------------\n// Base color palette\n// ---------------------------------------------------------------------------\n\nconst baseColors: Record<string, string> = {\n // Neutral\n 'neutral-0': '#FFFFFF',\n 'neutral-25': '#FAFBFB',\n 'neutral-50': '#F5F6F6',\n 'neutral-100': '#E5E8E7',\n 'neutral-150': '#DADEDC',\n 'neutral-200': '#CED3D2',\n 'neutral-250': '#BDC4C3',\n 'neutral-300': '#ABB5B3',\n 'neutral-350': '#97A2A0',\n 'neutral-400': '#828E8C',\n 'neutral-450': '#74817F',\n 'neutral-500': '#667472',\n 'neutral-600': '#586261',\n 'neutral-700': '#4B5353',\n 'neutral-800': '#424847',\n 'neutral-850': '#393F3E',\n 'neutral-900': '#303635',\n 'neutral-950': '#181B1B',\n 'neutral-950--t75': 'rgba(24, 27, 27, 0.75)',\n 'neutral-950--t50': 'rgba(24, 27, 27, 0.50)',\n 'neutral-950--t25': 'rgba(24, 27, 27, 0.25)',\n 'neutral-950--t10': 'rgba(24, 27, 27, 0.10)',\n\n // Green\n 'green-50': '#ECF9F3',\n 'green-100': '#D9F2E7',\n 'green-150': '#C7ECDE',\n 'green-200': '#B4E6D4',\n 'green-250': '#9ADEC8',\n 'green-300': '#80D5BB',\n 'green-350': '#64C9AB',\n 'green-400': '#4DC2A3',\n 'green-450': '#33B897',\n 'green-500': '#19AE8A',\n 'green-600': '#109274',\n 'green-700': '#0D755F',\n 'green-800': '#0B6556',\n 'green-850': '#065E4F',\n 'green-900': '#005748',\n 'green-950': '#00332A',\n 'green-950--t75': 'rgba(0, 51, 42, 0.75)',\n 'green-950--t50': 'rgba(0, 51, 42, 0.50)',\n 'green-950--t25': 'rgba(0, 51, 42, 0.25)',\n 'green-950--t10': 'rgba(0, 51, 42, 0.10)',\n\n // Red\n 'red-50': '#FEF3F1',\n 'red-100': '#FCE6E3',\n 'red-150': '#FAD5D1',\n 'red-200': '#F8C4BF',\n 'red-250': '#F9ADA5',\n 'red-300': '#F9958B',\n 'red-400': '#F67265',\n 'red-500': '#F34F3F',\n 'red-600': '#E52B19',\n 'red-700': '#CF2717',\n 'red-800': '#93251A',\n 'red-850': '#791F16',\n 'red-900': '#5F1811',\n 'red-950': '#340D09',\n 'red-950--t75': 'rgba(52, 13, 9, 0.75)',\n 'red-950--t50': 'rgba(52, 13, 9, 0.50)',\n 'red-950--t25': 'rgba(52, 13, 9, 0.25)',\n 'red-950--t10': 'rgba(52, 13, 9, 0.10)',\n\n // Yellow\n 'yellow-50': '#FEFCF1',\n 'yellow-100': '#FCF8E3',\n 'yellow-150': '#FAF4D1',\n 'yellow-200': '#F8EFBF',\n 'yellow-250': '#F9EBA5',\n 'yellow-300': '#F9E68B',\n 'yellow-350': '#F8E278',\n 'yellow-400': '#F7DE64',\n 'yellow-500': '#F3D53F',\n 'yellow-600': '#EBC714',\n 'yellow-700': '#BC8E10',\n 'yellow-800': '#826217',\n 'yellow-850': '#6D5213',\n 'yellow-900': '#57410F',\n 'yellow-950': '#2B2108',\n 'yellow-950--t75': 'rgba(43, 33, 8, 0.75)',\n 'yellow-950--t50': 'rgba(43, 33, 8, 0.50)',\n 'yellow-950--t25': 'rgba(43, 33, 8, 0.25)',\n 'yellow-950--t10': 'rgba(43, 33, 8, 0.10)',\n};\n\n// ---------------------------------------------------------------------------\n// Helper – resolve a base color reference to its hex, with optional opacity\n// ---------------------------------------------------------------------------\n\nexport function resolve(ref: string, opacity?: number): string {\n const hex = baseColors[ref];\n if (!hex) return ref; // pass through raw hex / css value\n\n if (opacity === undefined || opacity === 100) return hex;\n\n // Convert hex to rgb then apply opacity via rgba()\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${(opacity / 100).toFixed(2)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Default semantic token mappings\n// ---------------------------------------------------------------------------\n\nfunction defaultSemanticColors(): Record<string, string> {\n return {\n // Text\n 'text-primary': resolve('neutral-950'),\n 'text-secondary': resolve('neutral-950', 75),\n 'text-disabled': resolve('neutral-950', 50),\n 'text-primary-inverse': resolve('neutral-0'),\n 'text-secondary-inverse': resolve('neutral-0', 75),\n 'text-inverse-disabled': resolve('neutral-0', 50),\n 'text-action-primary': resolve('neutral-0'),\n 'text-action-primary-disabled': resolve('neutral-0', 50),\n 'text-action-secondary': resolve('neutral-950'),\n 'text-action-secondary-disabled': resolve('neutral-950', 50),\n 'text-action-tertiary': resolve('neutral-0'),\n 'text-action-tertiary-hover': resolve('neutral-0', 75),\n 'text-action-tertiary-disabled': resolve('neutral-0', 50),\n 'text-err': resolve('red-950'),\n 'text-err-disabled': resolve('red-950', 50),\n\n // Link\n 'link-primary': resolve('green-900'),\n 'link-primary-hover': resolve('green-950', 75),\n 'link-primary-disabled': resolve('green-950', 50),\n 'link-secondary': resolve('neutral-950'),\n 'link-secondary-hover': resolve('neutral-950', 75),\n 'link-secondary-disabled': resolve('neutral-950', 50),\n 'link-tertiary': resolve('neutral-950', 50),\n 'link-tertiary-hover': resolve('neutral-950', 25),\n 'link-tertiary-disabled': resolve('neutral-950', 25),\n 'link-inverse': resolve('neutral-0'),\n 'link-inverse-hover': resolve('neutral-0', 75),\n 'link-inverse-disabled': resolve('neutral-0', 50),\n\n // Background fills\n 'fill-bg-primary': resolve('neutral-0'),\n 'fill-bg-secondary': resolve('neutral-50'),\n 'fill-bg-tertiary': resolve('green-900'),\n 'fill-bg-err': resolve('red-100'),\n 'fill-bg-info': resolve('neutral-0'),\n 'fill-bg-dimmer': resolve('neutral-950', 75),\n\n // Action fills\n 'fill-action-primary': resolve('green-900'),\n 'fill-action-primary-hover': resolve('green-950'),\n 'fill-action-primary-active': resolve('green-950'),\n 'fill-action-primary-focus': resolve('green-900'),\n 'fill-action-primary-selected': resolve('green-900'),\n 'fill-action-primary-disabled': resolve('green-900'),\n 'fill-action-secondary': resolve('neutral-100'),\n 'fill-action-secondary-hover': resolve('neutral-200'),\n 'fill-action-secondary-active': resolve('neutral-200'),\n 'fill-action-secondary-focus': resolve('neutral-100'),\n 'fill-action-secondary-selected': resolve('neutral-100'),\n 'fill-action-secondary-disabled': resolve('neutral-100'),\n 'fill-action-inverse': resolve('neutral-0'),\n 'fill-action-inverse-hover': resolve('neutral-0', 90),\n 'fill-action-inverse-active': resolve('neutral-0', 90),\n 'fill-action-inverse-focus': resolve('neutral-0'),\n 'fill-action-inverse-selected': resolve('neutral-0'),\n 'fill-action-inverse-disabled': resolve('neutral-0'),\n 'fill-action-ghost': resolve('neutral-0', 0),\n 'fill-action-ghost-hover': resolve('neutral-0', 10),\n 'fill-action-ghost-active': resolve('neutral-0', 10),\n 'fill-action-ghost-focus': resolve('neutral-0', 0),\n 'fill-action-ghost-selected': resolve('neutral-0', 0),\n 'fill-action-ghost-disabled': resolve('neutral-0', 0),\n\n // Form fills\n 'fill-form-primary': resolve('neutral-0'),\n 'fill-form-primary-hover': resolve('neutral-0'),\n 'fill-form-primary-active': resolve('neutral-0'),\n 'fill-form-primary-focus': resolve('neutral-0'),\n 'fill-form-primary-selected': resolve('neutral-0'),\n 'fill-form-primary-disabled': resolve('neutral-0'),\n\n // Borders\n 'border-light': resolve('neutral-100'),\n 'border-heavy': resolve('neutral-200'),\n 'border-inverse': resolve('neutral-0'),\n 'border-focus': resolve('green-900'),\n 'border-err': resolve('red-800'),\n\n // Form borders\n 'border-form-primary': resolve('neutral-300'),\n 'border-form-primary-hover': resolve('neutral-600'),\n 'border-form-primary-active': resolve('green-900'),\n 'border-form-primary-focus': resolve('green-900'),\n 'border-form-primary-selected': resolve('green-900'),\n 'border-form-primary-disabled': resolve('neutral-200'),\n\n // Icons\n 'icon-primary': resolve('neutral-950'),\n 'icon-primary-disabled': resolve('neutral-950', 50),\n 'icon-inverse': resolve('neutral-0'),\n 'icon-inverse-disabled': resolve('neutral-0', 50),\n 'icon-err': resolve('red-950'),\n 'icon-err-disabled': resolve('red-950', 50),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Typography token definitions\n// ---------------------------------------------------------------------------\n\nconst fontFamilyPrimary = '\"Instrument Sans\", sans-serif';\nconst fontFamilySecondary = '\"Inter\", sans-serif';\n\nconst typographyTokens: Record<string, TypographyDef> = {\n 'title-sm': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.0625rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n textWrap: 'balance',\n },\n 'title-lg': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n fontWeight: '600',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '680',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'text-xs': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-xs-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-sm': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-sm-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '680',\n lineHeight: '1.1',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'form-text': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'form-label': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'btn-small': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'btn-reg': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'link-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacing tokens\n// ---------------------------------------------------------------------------\n\nconst spacingTokens: Record<string, string> = {\n // Fixed\n 'space-0': '0rem',\n 'space-0-25': '0.0625rem',\n 'space-1': '0.25rem',\n 'space-2': '0.5rem',\n 'space-3': '0.75rem',\n 'space-4': '1rem',\n 'space-5': '1.25rem',\n 'space-6': '1.5rem',\n 'space-8': '2rem',\n 'space-9': '2.25rem',\n 'space-12': '3rem',\n 'space-16': '4rem',\n 'space-18': '4.5rem',\n 'space-24': '6rem',\n 'space-30': '7.5rem',\n 'space-36': '9rem',\n 'space-48': '12rem',\n 'space-72': '18rem',\n\n // Fluid\n 'space-fluid-1-2': 'clamp(0.25rem, 0.1706rem + 0.3968vw, 0.5rem)',\n 'space-fluid-2-4': 'clamp(0.5rem, 0.3413rem + 0.7937vw, 1rem)',\n 'space-fluid-4-5': 'clamp(1rem, 0.9206rem + 0.3968vw, 1.25rem)',\n 'space-fluid-4-6': 'clamp(1rem, 0.8413rem + 0.7937vw, 1.5rem)',\n 'space-fluid-4-8': 'clamp(1rem, 0.6825rem + 1.5873vw, 2rem)',\n 'space-fluid-4-9': 'clamp(1rem, 0.6032rem + 1.9841vw, 2.25rem)',\n 'space-fluid-5-6': 'clamp(1.25rem, 1.1706rem + 0.3968vw, 1.5rem)',\n 'space-fluid-6-9': 'clamp(1.5rem, 1.2619rem + 1.1905vw, 2.25rem)',\n 'space-fluid-8-16': 'clamp(2rem, 1.3651rem + 3.1746vw, 4rem)',\n 'space-fluid-16-18': 'clamp(4rem, 3.8413rem + 0.7937vw, 4.5rem)',\n 'space-fluid-30-36': 'clamp(7.5rem, 7.0238rem + 2.381vw, 9rem)',\n 'space-fluid-48-72': 'clamp(12rem, 10.0952rem + 9.5238vw, 18rem)',\n};\n\n// ---------------------------------------------------------------------------\n// Border width tokens\n// ---------------------------------------------------------------------------\n\nconst borderWidthTokens: Record<string, string> = {\n 'border-none': '0',\n 'border-xs': '.0625rem',\n 'border-sm': '.078125rem',\n 'border-md': '.09375rem',\n};\n\n// ---------------------------------------------------------------------------\n// Border radius tokens\n// ---------------------------------------------------------------------------\n\nconst borderRadiusTokens: Record<string, string> = {\n 'rad-none': '0',\n 'rad-xs': '.375rem',\n 'rad-sm': '.75rem',\n 'rad-md': '1rem',\n 'rad-lg': '1.25rem',\n 'rad-xl': '1.5rem',\n 'rad-rounded': '100rem',\n};\n\n// ---------------------------------------------------------------------------\n// Elevation (box-shadow) tokens\n// ---------------------------------------------------------------------------\n\nconst elevationTokens: Record<string, string> = {\n 'elevation-low': '0 2px 8px 0 var(--col-neutral-950--t10)',\n 'elevation-normal': '0 2px 8px 4px var(--col-neutral-950--t10)',\n};\n\n// ---------------------------------------------------------------------------\n// Canonical design token primitives (source of truth)\n// ---------------------------------------------------------------------------\n\nconst canonicalColourPrimitives: Record<string, string> = {\n 'col-neutral-0': 'hsla(0, 0%, 100%, 1)',\n 'col-neutral-0--t0': 'hsla(0, 0%, 100%, 0)',\n 'col-neutral-0--t10': 'hsla(0, 0%, 100%, 0.1)',\n 'col-neutral-0--t25': 'hsla(0, 0%, 100%, 0.25)',\n 'col-neutral-0--t50': 'hsla(0, 0%, 100%, 0.5)',\n 'col-neutral-0--t75': 'hsla(0, 0%, 100%, 0.75)',\n 'col-neutral-0--t90': 'hsla(0, 0%, 100%, 0.9)',\n 'col-neutral-50': 'hsla(180, 5%, 96%, 1)',\n 'col-neutral-100': 'hsla(160, 6%, 90%, 1)',\n 'col-neutral-200': 'hsla(168, 5%, 82%, 1)',\n 'col-neutral-300': 'hsla(168, 6%, 69%, 1)',\n 'col-neutral-400': 'hsla(170, 5%, 53%, 1)',\n 'col-neutral-500': 'hsla(171, 6%, 43%, 1)',\n 'col-neutral-600': 'hsla(174, 5%, 36%, 1)',\n 'col-neutral-700': 'hsla(180, 5%, 31%, 1)',\n 'col-neutral-800': 'hsla(170, 4%, 27%, 1)',\n 'col-neutral-900': 'hsla(170, 6%, 20%, 1)',\n 'col-neutral-950': 'hsla(180, 5%, 10%, 1)',\n 'col-neutral-950--t10': 'hsla(180, 5%, 10%, 0.1)',\n 'col-neutral-950--t25': 'hsla(180, 5%, 10%, 0.25)',\n 'col-neutral-950--t50': 'hsla(180, 5%, 10%, 0.5)',\n 'col-neutral-950--t75': 'hsla(180, 5%, 10%, 0.75)',\n 'col-neutral-950--t90': 'hsla(180, 5%, 10%, 0.9)',\n 'col-green-50': 'hsla(156, 24%, 96%, 1)',\n 'col-green-100': 'hsla(154, 49%, 90%, 1)',\n 'col-green-200': 'hsla(158, 50%, 80%, 1)',\n 'col-green-300': 'hsla(162, 50%, 67%, 1)',\n 'col-green-400': 'hsla(164, 52%, 52%, 1)',\n 'col-green-500': 'hsla(166, 75%, 39%, 1)',\n 'col-green-600': 'hsla(166, 80%, 32%, 1)',\n 'col-green-700': 'hsla(167, 80%, 25%, 1)',\n 'col-green-800': 'hsla(170, 80%, 22%, 1)',\n 'col-green-900': 'hsla(170, 100%, 17%, 1)',\n 'col-green-950': 'hsla(170, 100%, 10%, 1)',\n 'col-green-950--t10': 'hsla(170, 100%, 10%, 0.1)',\n 'col-green-950--t50': 'hsla(170, 100%, 10%, 0.5)',\n 'col-green-950--t75': 'hsla(170, 100%, 10%, 0.75)',\n 'col-green-950--t90': 'hsla(170, 100%, 10%, 0.9)',\n 'col-red-50': 'hsla(7, 60%, 97%, 1)',\n 'col-red-100': 'hsla(7, 81%, 94%, 1)',\n 'col-red-200': 'hsla(5, 80%, 86%, 1)',\n 'col-red-300': 'hsla(5, 90%, 76%, 1)',\n 'col-red-400': 'hsla(5, 90%, 68%, 1)',\n 'col-red-500': 'hsla(5, 88%, 60%, 1)',\n 'col-red-600': 'hsla(5, 80%, 50%, 1)',\n 'col-red-700': 'hsla(5, 80%, 45%, 1)',\n 'col-red-800': 'hsla(5, 70%, 34%, 1)',\n 'col-red-900': 'hsla(5, 70%, 22%, 1)',\n 'col-red-950': 'hsla(5, 70%, 12%, 1)',\n 'col-red-950--t10': 'hsla(5, 70%, 12%, 0.1)',\n 'col-red-950--t50': 'hsla(5, 70%, 12%, 0.5)',\n 'col-red-950--t75': 'hsla(5, 70%, 12%, 0.75)',\n 'col-red-950--t90': 'hsla(5, 70%, 12%, 0.9)',\n 'col-yellow-50': 'hsla(47, 60%, 97%, 1)',\n 'col-yellow-100': 'hsla(50, 81%, 94%, 1)',\n 'col-yellow-200': 'hsla(50, 80%, 86%, 1)',\n 'col-yellow-300': 'hsla(50, 90%, 76%, 1)',\n 'col-yellow-400': 'hsla(50, 90%, 68%, 1)',\n 'col-yellow-500': 'hsla(50, 88%, 60%, 1)',\n 'col-yellow-600': 'hsla(50, 84%, 50%, 1)',\n 'col-yellow-700': 'hsla(44, 84%, 40%, 1)',\n 'col-yellow-800': 'hsla(42, 70%, 30%, 1)',\n 'col-yellow-900': 'hsla(42, 71%, 20%, 1)',\n 'col-yellow-950': 'hsla(42, 69%, 10%, 1)',\n 'col-yellow-950--t10': 'hsla(42, 69%, 10%, 0.1)',\n 'col-yellow-950--t50': 'hsla(42, 69%, 10%, 0.5)',\n 'col-yellow-950--t75': 'hsla(42, 69%, 10%, 0.75)',\n 'col-yellow-950--t90': 'hsla(42, 69%, 10%, 0.9)',\n};\n\nconst canonicalTransitionPrimitives: Record<string, string> = {\n 'trans-timing-light': 'ease-out',\n 'trans-timing-normal': 'ease-out',\n 'trans-timing-heavy': 'ease-in',\n 'trans-duration-snap': '30ms',\n 'trans-duration-normal': '120ms',\n 'trans-duration-slow': '300ms',\n};\n\nconst canonicalTypographyPrimitives: Record<string, string> = {\n 'font-size-fluid-25-32': 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n 'font-size-fluid-48-60': 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n 'font-family-primary': '\"Instrument Sans\", sans-serif',\n 'font-family-secondary': \"'Inter', system-ui, sans-serif\",\n 'font-size-a-sm': '1.0625rem',\n 'font-size-a-md': '1.1875rem',\n 'font-size-a-lg-fluid': 'var(--font-size-fluid-25-32)',\n 'font-size-a-xl-fluid': 'var(--font-size-fluid-48-60)',\n 'font-size-b-xs': '0.75rem',\n 'font-size-b-sm': '1rem',\n 'font-size-b-md': '1.125rem',\n 'font-weight-xs': '400',\n 'font-weight-sm': '500',\n 'font-weight-md': '600',\n 'font-weight-lg': '680',\n 'font-line-tight': '1.1',\n 'font-line-normal': '1.2',\n 'font-line-loose': '1.4',\n 'font-ltrspc-xs': '-0.005em',\n 'font-ltrspc-sm': '0.01em',\n 'font-ltrspc-md': '0.02em',\n};\n\n// ---------------------------------------------------------------------------\n// Breakpoints\n// ---------------------------------------------------------------------------\n\nconst screens: Record<string, string> = {\n xs: '0px',\n sm: '600px',\n md: '800px',\n lg: '940px',\n xl: '1440px',\n};\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Merge helpers\n// ---------------------------------------------------------------------------\n\nfunction mergeTypography(\n base: Record<string, TypographyDef>,\n overrides: Record<string, Partial<TypographyDef>> | undefined,\n): Record<string, TypographyDef> {\n if (!overrides) return base;\n const merged = { ...base };\n for (const [key, partial] of Object.entries(overrides)) {\n merged[key] = { ...(merged[key] ?? ({} as TypographyDef)), ...partial };\n }\n return merged;\n}\n\nfunction resolvedFontFamilies(options: JiwambePluginOptions | undefined) {\n return {\n primary: options?.fontFamily?.primary ?? fontFamilyPrimary,\n secondary: options?.fontFamily?.secondary ?? fontFamilySecondary,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\nconst jiwambePlugin = plugin.withOptions<JiwambePluginOptions | undefined>(\n (options) => {\n return ({ addBase, addUtilities }) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n const mergedTypography = mergeTypography(typographyTokens, options?.typography);\n\n // -----------------------------------------------------------------\n // 1. Generate CSS custom properties on :root\n // -----------------------------------------------------------------\n\n const cssVars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(baseColors)) {\n cssVars[`--color-${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n cssVars[`--color-${key}`] = value;\n }\n // Alias for list marker styling (--col-* naming)\n if (mergedColors['text-secondary']) {\n cssVars['--col-text-secondary'] = mergedColors['text-secondary'];\n }\n for (const [key, value] of Object.entries(mergedSpacing)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderWidth)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderRadius)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedElevation)) {\n cssVars[`--${key}`] = value;\n }\n\n cssVars['--font-family-primary'] = fonts.primary;\n cssVars['--font-family-secondary'] = fonts.secondary;\n\n for (const [key, value] of Object.entries(canonicalColourPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTransitionPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n\n addBase({ ':root': cssVars });\n\n // -----------------------------------------------------------------\n // 1b. Skeleton shimmer keyframe and utility class\n // -----------------------------------------------------------------\n\n addBase({\n '@keyframes jiwambe-shimmer': {\n '0%': {\n backgroundPosition: '-200% 0',\n },\n '100%': {\n backgroundPosition: '200% 0',\n },\n },\n '.jiwambe-skeleton': {\n backgroundColor: 'var(--col-neutral-100)',\n backgroundImage: [\n 'linear-gradient(',\n ' 90deg,',\n ' var(--col-neutral-100) 25%,',\n ' var(--col-neutral-50) 50%,',\n ' var(--col-neutral-100) 75%',\n ')',\n ].join(''),\n backgroundSize: '200% 100%',\n backgroundRepeat: 'no-repeat',\n animation: 'jiwambe-shimmer 1.5s ease-in-out infinite',\n },\n });\n\n // -----------------------------------------------------------------\n // 1c. List marker base styles\n // -----------------------------------------------------------------\n\n addBase({\n '.jiwambe-list': {\n paddingLeft: 'var(--space-6)',\n margin: '0',\n },\n '.jiwambe-list--unstyled': {\n paddingLeft: '0',\n listStyle: 'none',\n },\n '.jiwambe-list--disc li::marker': {\n color: 'var(--col-text-secondary)',\n },\n '.jiwambe-list--decimal li::marker': {\n color: 'var(--col-text-secondary)',\n fontVariantNumeric: 'tabular-nums',\n },\n '.jiwambe-list--none': {\n listStyle: 'none',\n paddingLeft: '0',\n },\n '.jiwambe-list-item': {\n paddingLeft: 'var(--space-1)',\n },\n '.jiwambe-list-item + .jiwambe-list-item': {\n marginTop: 'var(--space-0)',\n },\n });\n\n // -----------------------------------------------------------------\n // 2. Typography utility classes\n // -----------------------------------------------------------------\n\n const typographyUtilities: Record<string, Record<string, string>> = {};\n\n for (const [name, def] of Object.entries(mergedTypography)) {\n const styles: Record<string, string> = {\n 'font-family': def.fontFamily,\n 'font-size': def.fontSize,\n 'font-weight': def.fontWeight,\n 'line-height': def.lineHeight,\n };\n if (def.letterSpacing) styles['letter-spacing'] = def.letterSpacing;\n if (def.textWrap) styles['text-wrap'] = def.textWrap;\n\n typographyUtilities[`.text-${name}`] = styles;\n }\n\n addUtilities(typographyUtilities);\n };\n },\n (options) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n\n const allColors: Record<string, string> = {};\n for (const [key, value] of Object.entries(baseColors)) {\n allColors[key] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n allColors[key] = value;\n }\n\n // Spacing theme: each token maps to var(--token) so utilities use CSS variables.\n // Add short keys for fluid tokens so px-fluid-4-9 works alongside px-space-fluid-4-9.\n const spacingExtension: Record<string, string> = {};\n for (const key of Object.keys(mergedSpacing)) {\n spacingExtension[key] = `var(--${key})`;\n if (key.startsWith('space-fluid-')) {\n const shortKey = key.replace(/^space-/, '');\n spacingExtension[shortKey] = `var(--${key})`;\n }\n }\n\n return {\n theme: {\n screens,\n extend: {\n colors: allColors,\n spacing: spacingExtension,\n borderWidth: mergedBorderWidth,\n borderRadius: mergedBorderRadius,\n boxShadow: mergedElevation,\n fontFamily: {\n primary: [fonts.primary],\n secondary: [fonts.secondary],\n },\n },\n },\n };\n },\n);\n\nexport default jiwambePlugin;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jiwambe-plugin.js","sources":["../../src/plugin/jiwambe-plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TypographyDef {\n fontFamily: string;\n fontSize: string;\n fontWeight: string;\n lineHeight: string;\n letterSpacing?: string;\n textWrap?: string;\n}\n\nexport interface JiwambePluginOptions {\n /** Override or extend semantic color token mappings. */\n colors?: Record<string, string>;\n /** Override or extend spacing tokens. */\n spacing?: Record<string, string>;\n /** Override or extend border width tokens. */\n borderWidth?: Record<string, string>;\n /** Override or extend border radius tokens. */\n borderRadius?: Record<string, string>;\n /** Override or extend elevation (box-shadow) tokens. */\n elevation?: Record<string, string>;\n /** Override or extend typography definitions. Partial overrides are merged with defaults. */\n typography?: Record<string, Partial<TypographyDef>>;\n /** Override primary and/or secondary font families. */\n fontFamily?: { primary?: string; secondary?: string };\n}\n\n// ---------------------------------------------------------------------------\n// Base color palette\n// ---------------------------------------------------------------------------\n\nconst baseColors: Record<string, string> = {\n // Neutral\n 'neutral-0': '#FFFFFF',\n 'neutral-25': '#FAFBFB',\n 'neutral-50': '#F5F6F6',\n 'neutral-100': '#E5E8E7',\n 'neutral-150': '#DADEDC',\n 'neutral-200': '#CED3D2',\n 'neutral-250': '#BDC4C3',\n 'neutral-300': '#ABB5B3',\n 'neutral-350': '#97A2A0',\n 'neutral-400': '#828E8C',\n 'neutral-450': '#74817F',\n 'neutral-500': '#667472',\n 'neutral-600': '#586261',\n 'neutral-700': '#4B5353',\n 'neutral-800': '#424847',\n 'neutral-850': '#393F3E',\n 'neutral-900': '#303635',\n 'neutral-950': '#181B1B',\n 'neutral-950--t75': 'rgba(24, 27, 27, 0.75)',\n 'neutral-950--t50': 'rgba(24, 27, 27, 0.50)',\n 'neutral-950--t25': 'rgba(24, 27, 27, 0.25)',\n 'neutral-950--t10': 'rgba(24, 27, 27, 0.10)',\n\n // Green\n 'green-50': '#ECF9F3',\n 'green-100': '#D9F2E7',\n 'green-150': '#C7ECDE',\n 'green-200': '#B4E6D4',\n 'green-250': '#9ADEC8',\n 'green-300': '#80D5BB',\n 'green-350': '#64C9AB',\n 'green-400': '#4DC2A3',\n 'green-450': '#33B897',\n 'green-500': '#19AE8A',\n 'green-600': '#109274',\n 'green-700': '#0D755F',\n 'green-800': '#0B6556',\n 'green-850': '#065E4F',\n 'green-900': '#005748',\n 'green-950': '#00332A',\n 'green-950--t75': 'rgba(0, 51, 42, 0.75)',\n 'green-950--t50': 'rgba(0, 51, 42, 0.50)',\n 'green-950--t25': 'rgba(0, 51, 42, 0.25)',\n 'green-950--t10': 'rgba(0, 51, 42, 0.10)',\n\n // Red\n 'red-50': '#FEF3F1',\n 'red-100': '#FCE6E3',\n 'red-150': '#FAD5D1',\n 'red-200': '#F8C4BF',\n 'red-250': '#F9ADA5',\n 'red-300': '#F9958B',\n 'red-400': '#F67265',\n 'red-500': '#F34F3F',\n 'red-600': '#E52B19',\n 'red-700': '#CF2717',\n 'red-800': '#93251A',\n 'red-850': '#791F16',\n 'red-900': '#5F1811',\n 'red-950': '#340D09',\n 'red-950--t75': 'rgba(52, 13, 9, 0.75)',\n 'red-950--t50': 'rgba(52, 13, 9, 0.50)',\n 'red-950--t25': 'rgba(52, 13, 9, 0.25)',\n 'red-950--t10': 'rgba(52, 13, 9, 0.10)',\n\n // Yellow\n 'yellow-50': '#FEFCF1',\n 'yellow-100': '#FCF8E3',\n 'yellow-150': '#FAF4D1',\n 'yellow-200': '#F8EFBF',\n 'yellow-250': '#F9EBA5',\n 'yellow-300': '#F9E68B',\n 'yellow-350': '#F8E278',\n 'yellow-400': '#F7DE64',\n 'yellow-500': '#F3D53F',\n 'yellow-600': '#EBC714',\n 'yellow-700': '#BC8E10',\n 'yellow-800': '#826217',\n 'yellow-850': '#6D5213',\n 'yellow-900': '#57410F',\n 'yellow-950': '#2B2108',\n 'yellow-950--t75': 'rgba(43, 33, 8, 0.75)',\n 'yellow-950--t50': 'rgba(43, 33, 8, 0.50)',\n 'yellow-950--t25': 'rgba(43, 33, 8, 0.25)',\n 'yellow-950--t10': 'rgba(43, 33, 8, 0.10)',\n};\n\n// ---------------------------------------------------------------------------\n// Helper – resolve a base color reference to its hex, with optional opacity\n// ---------------------------------------------------------------------------\n\nexport function resolve(ref: string, opacity?: number): string {\n const hex = baseColors[ref];\n if (!hex) return ref; // pass through raw hex / css value\n\n if (opacity === undefined || opacity === 100) return hex;\n\n // Convert hex to rgb then apply opacity via rgba()\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${(opacity / 100).toFixed(2)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Default semantic token mappings\n// ---------------------------------------------------------------------------\n\nfunction defaultSemanticColors(): Record<string, string> {\n return {\n // Text\n 'text-primary': resolve('neutral-950'),\n 'text-secondary': resolve('neutral-950', 75),\n 'text-disabled': resolve('neutral-950', 50),\n 'text-primary-inverse': resolve('neutral-0'),\n 'text-secondary-inverse': resolve('neutral-0', 75),\n 'text-inverse-disabled': resolve('neutral-0', 50),\n 'text-action-primary': resolve('neutral-0'),\n 'text-action-primary-disabled': resolve('neutral-0', 50),\n 'text-action-secondary': resolve('neutral-950'),\n 'text-action-secondary-disabled': resolve('neutral-950', 50),\n 'text-action-tertiary': resolve('neutral-0'),\n 'text-action-tertiary-hover': resolve('neutral-0', 75),\n 'text-action-tertiary-disabled': resolve('neutral-0', 50),\n 'text-err': resolve('red-950'),\n 'text-err-disabled': resolve('red-950', 50),\n\n // Link\n 'link-primary': resolve('green-900'),\n 'link-primary-hover': resolve('green-950', 75),\n 'link-primary-disabled': resolve('green-950', 50),\n 'link-secondary': resolve('neutral-950'),\n 'link-secondary-hover': resolve('neutral-950', 75),\n 'link-secondary-disabled': resolve('neutral-950', 50),\n 'link-tertiary': resolve('neutral-950', 50),\n 'link-tertiary-hover': resolve('neutral-950', 25),\n 'link-tertiary-disabled': resolve('neutral-950', 25),\n 'link-inverse': resolve('neutral-0'),\n 'link-inverse-hover': resolve('neutral-0', 75),\n 'link-inverse-disabled': resolve('neutral-0', 50),\n\n // Background fills\n 'fill-bg-primary': resolve('neutral-0'),\n 'fill-bg-secondary': resolve('neutral-50'),\n 'fill-bg-tertiary': resolve('green-900'),\n 'fill-bg-err': resolve('red-100'),\n 'fill-bg-info': resolve('neutral-0'),\n 'fill-bg-dimmer': resolve('neutral-950', 75),\n\n // Action fills\n 'fill-action-primary': resolve('green-900'),\n 'fill-action-primary-hover': resolve('green-950'),\n 'fill-action-primary-active': resolve('green-950'),\n 'fill-action-primary-focus': resolve('green-900'),\n 'fill-action-primary-selected': resolve('green-900'),\n 'fill-action-primary-disabled': resolve('green-900'),\n 'fill-action-secondary': resolve('neutral-100'),\n 'fill-action-secondary-hover': resolve('neutral-200'),\n 'fill-action-secondary-active': resolve('neutral-200'),\n 'fill-action-secondary-focus': resolve('neutral-100'),\n 'fill-action-secondary-selected': resolve('neutral-100'),\n 'fill-action-secondary-disabled': resolve('neutral-100'),\n 'fill-action-inverse': resolve('neutral-0'),\n 'fill-action-inverse-hover': resolve('neutral-0', 90),\n 'fill-action-inverse-active': resolve('neutral-0', 90),\n 'fill-action-inverse-focus': resolve('neutral-0'),\n 'fill-action-inverse-selected': resolve('neutral-0'),\n 'fill-action-inverse-disabled': resolve('neutral-0'),\n 'fill-action-ghost': resolve('neutral-0', 0),\n 'fill-action-ghost-hover': resolve('neutral-0', 10),\n 'fill-action-ghost-active': resolve('neutral-0', 10),\n 'fill-action-ghost-focus': resolve('neutral-0', 0),\n 'fill-action-ghost-selected': resolve('neutral-0', 0),\n 'fill-action-ghost-disabled': resolve('neutral-0', 0),\n\n // Form fills\n 'fill-form-primary': resolve('neutral-0'),\n 'fill-form-primary-hover': resolve('neutral-0'),\n 'fill-form-primary-active': resolve('neutral-0'),\n 'fill-form-primary-focus': resolve('neutral-0'),\n 'fill-form-primary-selected': resolve('neutral-0'),\n 'fill-form-primary-disabled': resolve('neutral-0'),\n\n // Borders\n 'border-light': resolve('neutral-100'),\n 'border-heavy': resolve('neutral-200'),\n 'border-inverse': resolve('neutral-0'),\n 'border-focus': resolve('green-900'),\n 'border-err': resolve('red-800'),\n\n // Form borders\n 'border-form-primary': resolve('neutral-300'),\n 'border-form-primary-hover': resolve('neutral-600'),\n 'border-form-primary-active': resolve('green-900'),\n 'border-form-primary-focus': resolve('green-900'),\n 'border-form-primary-selected': resolve('green-900'),\n 'border-form-primary-disabled': resolve('neutral-200'),\n\n // Icons\n 'icon-primary': resolve('neutral-950'),\n 'icon-primary-disabled': resolve('neutral-950', 50),\n 'icon-inverse': resolve('neutral-0'),\n 'icon-inverse-disabled': resolve('neutral-0', 50),\n 'icon-err': resolve('red-950'),\n 'icon-err-disabled': resolve('red-950', 50),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Typography token definitions\n// ---------------------------------------------------------------------------\n\nconst fontFamilyPrimary = '\"Instrument Sans\", sans-serif';\nconst fontFamilySecondary = '\"Inter\", sans-serif';\n\nconst typographyTokens: Record<string, TypographyDef> = {\n 'title-sm': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(0.9375rem, 0.8482rem + 0.4464vw, 1.0625rem)',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1rem, 0.8661rem + 0.6696vw, 1.1875rem)',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n textWrap: 'balance',\n },\n 'title-lg': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n fontWeight: '600',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'title-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '800',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'text-xs': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '400',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-xs-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '0.75rem',\n fontWeight: '600',\n lineHeight: '1.4',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'text-sm': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-sm-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-md-bold': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '600',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'text-xl': {\n fontFamily: fontFamilyPrimary,\n fontSize: 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n fontWeight: '800',\n lineHeight: '1.0',\n letterSpacing: '-0.005em',\n textWrap: 'pretty',\n },\n 'form-text': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '400',\n lineHeight: '1.4',\n textWrap: 'pretty',\n },\n 'form-label': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '-0.005em',\n textWrap: 'balance',\n },\n 'btn-small': {\n fontFamily: fontFamilySecondary,\n fontSize: '1rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'btn-reg': {\n fontFamily: fontFamilySecondary,\n fontSize: '1.125rem',\n fontWeight: '500',\n lineHeight: '1.4',\n },\n 'link-md': {\n fontFamily: fontFamilyPrimary,\n fontSize: '1.1875rem',\n fontWeight: '600',\n lineHeight: '1.2',\n letterSpacing: '0.02em',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacing tokens\n// ---------------------------------------------------------------------------\n\nconst spacingTokens: Record<string, string> = {\n // Fixed\n 'space-0': '0rem',\n 'space-0-25': '0.0625rem',\n 'space-1': '0.25rem',\n 'space-2': '0.5rem',\n 'space-3': '0.75rem',\n 'space-4': '1rem',\n 'space-5': '1.25rem',\n 'space-6': '1.5rem',\n 'space-8': '2rem',\n 'space-9': '2.25rem',\n 'space-12': '3rem',\n 'space-16': '4rem',\n 'space-18': '4.5rem',\n 'space-24': '6rem',\n 'space-30': '7.5rem',\n 'space-36': '9rem',\n 'space-48': '12rem',\n 'space-72': '18rem',\n\n // Fluid\n 'space-fluid-1-2': 'clamp(0.25rem, 0.1706rem + 0.3968vw, 0.5rem)',\n 'space-fluid-2-4': 'clamp(0.5rem, 0.3413rem + 0.7937vw, 1rem)',\n 'space-fluid-4-5': 'clamp(1rem, 0.9206rem + 0.3968vw, 1.25rem)',\n 'space-fluid-4-6': 'clamp(1rem, 0.8413rem + 0.7937vw, 1.5rem)',\n 'space-fluid-4-8': 'clamp(1rem, 0.6825rem + 1.5873vw, 2rem)',\n 'space-fluid-4-9': 'clamp(1rem, 0.6032rem + 1.9841vw, 2.25rem)',\n 'space-fluid-5-6': 'clamp(1.25rem, 1.1706rem + 0.3968vw, 1.5rem)',\n 'space-fluid-6-9': 'clamp(1.5rem, 1.2619rem + 1.1905vw, 2.25rem)',\n 'space-fluid-8-16': 'clamp(2rem, 1.3651rem + 3.1746vw, 4rem)',\n 'space-fluid-16-18': 'clamp(4rem, 3.8413rem + 0.7937vw, 4.5rem)',\n 'space-fluid-30-36': 'clamp(7.5rem, 7.0238rem + 2.381vw, 9rem)',\n 'space-fluid-48-72': 'clamp(12rem, 10.0952rem + 9.5238vw, 18rem)',\n};\n\n// ---------------------------------------------------------------------------\n// Border width tokens\n// ---------------------------------------------------------------------------\n\nconst borderWidthTokens: Record<string, string> = {\n 'border-none': '0',\n 'border-xs': '.0625rem',\n 'border-sm': '.078125rem',\n 'border-md': '.09375rem',\n};\n\n// ---------------------------------------------------------------------------\n// Border radius tokens\n// ---------------------------------------------------------------------------\n\nconst borderRadiusTokens: Record<string, string> = {\n 'rad-none': '0',\n 'rad-xs': '.375rem',\n 'rad-sm': '.75rem',\n 'rad-md': '1rem',\n 'rad-lg': '1.25rem',\n 'rad-xl': '1.5rem',\n 'rad-rounded': '100rem',\n};\n\n// ---------------------------------------------------------------------------\n// Elevation (box-shadow) tokens\n// ---------------------------------------------------------------------------\n\nconst elevationTokens: Record<string, string> = {\n 'elevation-low': '0 2px 8px 0 var(--col-neutral-950--t10)',\n 'elevation-normal': '0 2px 8px 4px var(--col-neutral-950--t10)',\n};\n\n// ---------------------------------------------------------------------------\n// Canonical design token primitives (source of truth)\n// ---------------------------------------------------------------------------\n\nconst canonicalColourPrimitives: Record<string, string> = {\n 'col-neutral-0': 'hsla(0, 0%, 100%, 1)',\n 'col-neutral-0--t0': 'hsla(0, 0%, 100%, 0)',\n 'col-neutral-0--t10': 'hsla(0, 0%, 100%, 0.1)',\n 'col-neutral-0--t25': 'hsla(0, 0%, 100%, 0.25)',\n 'col-neutral-0--t50': 'hsla(0, 0%, 100%, 0.5)',\n 'col-neutral-0--t75': 'hsla(0, 0%, 100%, 0.75)',\n 'col-neutral-0--t90': 'hsla(0, 0%, 100%, 0.9)',\n 'col-neutral-50': 'hsla(180, 5%, 96%, 1)',\n 'col-neutral-100': 'hsla(160, 6%, 90%, 1)',\n 'col-neutral-200': 'hsla(168, 5%, 82%, 1)',\n 'col-neutral-300': 'hsla(168, 6%, 69%, 1)',\n 'col-neutral-400': 'hsla(170, 5%, 53%, 1)',\n 'col-neutral-500': 'hsla(171, 6%, 43%, 1)',\n 'col-neutral-600': 'hsla(174, 5%, 36%, 1)',\n 'col-neutral-700': 'hsla(180, 5%, 31%, 1)',\n 'col-neutral-800': 'hsla(170, 4%, 27%, 1)',\n 'col-neutral-900': 'hsla(170, 6%, 20%, 1)',\n 'col-neutral-950': 'hsla(180, 5%, 10%, 1)',\n 'col-neutral-950--t10': 'hsla(180, 5%, 10%, 0.1)',\n 'col-neutral-950--t25': 'hsla(180, 5%, 10%, 0.25)',\n 'col-neutral-950--t50': 'hsla(180, 5%, 10%, 0.5)',\n 'col-neutral-950--t75': 'hsla(180, 5%, 10%, 0.75)',\n 'col-neutral-950--t90': 'hsla(180, 5%, 10%, 0.9)',\n 'col-green-50': 'hsla(156, 24%, 96%, 1)',\n 'col-green-100': 'hsla(154, 49%, 90%, 1)',\n 'col-green-200': 'hsla(158, 50%, 80%, 1)',\n 'col-green-300': 'hsla(162, 50%, 67%, 1)',\n 'col-green-400': 'hsla(164, 52%, 52%, 1)',\n 'col-green-500': 'hsla(166, 75%, 39%, 1)',\n 'col-green-600': 'hsla(166, 80%, 32%, 1)',\n 'col-green-700': 'hsla(167, 80%, 25%, 1)',\n 'col-green-800': 'hsla(170, 80%, 22%, 1)',\n 'col-green-900': 'hsla(170, 100%, 17%, 1)',\n 'col-green-950': 'hsla(170, 100%, 10%, 1)',\n 'col-green-950--t10': 'hsla(170, 100%, 10%, 0.1)',\n 'col-green-950--t50': 'hsla(170, 100%, 10%, 0.5)',\n 'col-green-950--t75': 'hsla(170, 100%, 10%, 0.75)',\n 'col-green-950--t90': 'hsla(170, 100%, 10%, 0.9)',\n 'col-red-50': 'hsla(7, 60%, 97%, 1)',\n 'col-red-100': 'hsla(7, 81%, 94%, 1)',\n 'col-red-200': 'hsla(5, 80%, 86%, 1)',\n 'col-red-300': 'hsla(5, 90%, 76%, 1)',\n 'col-red-400': 'hsla(5, 90%, 68%, 1)',\n 'col-red-500': 'hsla(5, 88%, 60%, 1)',\n 'col-red-600': 'hsla(5, 80%, 50%, 1)',\n 'col-red-700': 'hsla(5, 80%, 45%, 1)',\n 'col-red-800': 'hsla(5, 70%, 34%, 1)',\n 'col-red-900': 'hsla(5, 70%, 22%, 1)',\n 'col-red-950': 'hsla(5, 70%, 12%, 1)',\n 'col-red-950--t10': 'hsla(5, 70%, 12%, 0.1)',\n 'col-red-950--t50': 'hsla(5, 70%, 12%, 0.5)',\n 'col-red-950--t75': 'hsla(5, 70%, 12%, 0.75)',\n 'col-red-950--t90': 'hsla(5, 70%, 12%, 0.9)',\n 'col-yellow-50': 'hsla(47, 60%, 97%, 1)',\n 'col-yellow-100': 'hsla(50, 81%, 94%, 1)',\n 'col-yellow-200': 'hsla(50, 80%, 86%, 1)',\n 'col-yellow-300': 'hsla(50, 90%, 76%, 1)',\n 'col-yellow-400': 'hsla(50, 90%, 68%, 1)',\n 'col-yellow-500': 'hsla(50, 88%, 60%, 1)',\n 'col-yellow-600': 'hsla(50, 84%, 50%, 1)',\n 'col-yellow-700': 'hsla(44, 84%, 40%, 1)',\n 'col-yellow-800': 'hsla(42, 70%, 30%, 1)',\n 'col-yellow-900': 'hsla(42, 71%, 20%, 1)',\n 'col-yellow-950': 'hsla(42, 69%, 10%, 1)',\n 'col-yellow-950--t10': 'hsla(42, 69%, 10%, 0.1)',\n 'col-yellow-950--t50': 'hsla(42, 69%, 10%, 0.5)',\n 'col-yellow-950--t75': 'hsla(42, 69%, 10%, 0.75)',\n 'col-yellow-950--t90': 'hsla(42, 69%, 10%, 0.9)',\n};\n\nconst canonicalTransitionPrimitives: Record<string, string> = {\n 'trans-timing-light': 'ease-out',\n 'trans-timing-normal': 'ease-out',\n 'trans-timing-heavy': 'ease-in',\n 'trans-duration-snap': '30ms',\n 'trans-duration-normal': '120ms',\n 'trans-duration-slow': '300ms',\n};\n\nconst canonicalTypographyPrimitives: Record<string, string> = {\n 'font-size-fluid-25-32': 'clamp(1.5625rem, 1.4375rem + 0.625vw, 2rem)',\n 'font-size-fluid-48-60': 'clamp(3rem, 2.7857rem + 1.0714vw, 3.75rem)',\n 'font-family-primary': '\"Instrument Sans\", sans-serif',\n 'font-family-secondary': \"'Inter', system-ui, sans-serif\",\n 'font-size-s-sm': '1.0625rem',\n 'font-size-s-md': '1.1875rem',\n 'font-size-s-lg-fluid': 'var(--font-size-fluid-25-32)',\n 'font-size-s-xl-fluid': 'var(--font-size-fluid-48-60)',\n 'font-size-t-xs': '0.75rem',\n 'font-size-t-sm': '1rem',\n 'font-size-t-md': '1.125rem',\n 'font-weight-xs': '400',\n 'font-weight-sm': '500',\n 'font-weight-md': '600',\n 'font-weight-lg': '800',\n 'font-line-tight': '1.0',\n 'font-line-normal': '1.2',\n 'font-line-loose': '1.4',\n 'font-ltrspc-xs': '-0.005em',\n 'font-ltrspc-sm': '0.01em',\n 'font-ltrspc-md': '0.02em',\n};\n\n// ---------------------------------------------------------------------------\n// Breakpoints\n// ---------------------------------------------------------------------------\n\nconst screens: Record<string, string> = {\n xs: '0px',\n sm: '600px',\n md: '800px',\n lg: '940px',\n xl: '1440px',\n};\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Merge helpers\n// ---------------------------------------------------------------------------\n\nfunction mergeTypography(\n base: Record<string, TypographyDef>,\n overrides: Record<string, Partial<TypographyDef>> | undefined,\n): Record<string, TypographyDef> {\n if (!overrides) return base;\n const merged = { ...base };\n for (const [key, partial] of Object.entries(overrides)) {\n merged[key] = { ...(merged[key] ?? ({} as TypographyDef)), ...partial };\n }\n return merged;\n}\n\nfunction resolvedFontFamilies(options: JiwambePluginOptions | undefined) {\n return {\n primary: options?.fontFamily?.primary ?? fontFamilyPrimary,\n secondary: options?.fontFamily?.secondary ?? fontFamilySecondary,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\nconst jiwambePlugin = plugin.withOptions<JiwambePluginOptions | undefined>(\n (options) => {\n return ({ addBase, addUtilities }) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n const mergedTypography = mergeTypography(typographyTokens, options?.typography);\n\n // -----------------------------------------------------------------\n // 1. Generate CSS custom properties on :root\n // -----------------------------------------------------------------\n\n const cssVars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(baseColors)) {\n cssVars[`--color-${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n cssVars[`--color-${key}`] = value;\n }\n // Alias for list marker styling (--col-* naming)\n if (mergedColors['text-secondary']) {\n cssVars['--col-text-secondary'] = mergedColors['text-secondary'];\n }\n for (const [key, value] of Object.entries(mergedSpacing)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderWidth)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedBorderRadius)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(mergedElevation)) {\n cssVars[`--${key}`] = value;\n }\n\n cssVars['--font-family-primary'] = fonts.primary;\n cssVars['--font-family-secondary'] = fonts.secondary;\n\n for (const [key, value] of Object.entries(canonicalColourPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTransitionPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n for (const [key, value] of Object.entries(canonicalTypographyPrimitives)) {\n cssVars[`--${key}`] = value;\n }\n\n addBase({\n ':root': cssVars,\n body: {\n 'text-rendering': 'optimizeLegibility',\n '-webkit-font-smoothing': 'antialiased',\n '-moz-osx-font-smoothing': 'grayscale',\n 'text-size-adjust': 'none',\n '-webkit-text-size-adjust': 'none',\n '-moz-text-size-adjust': 'none',\n 'font-optical-sizing': 'auto',\n },\n });\n\n // -----------------------------------------------------------------\n // 1b. Skeleton shimmer keyframe and utility class\n // -----------------------------------------------------------------\n\n addBase({\n '@keyframes jiwambe-shimmer': {\n '0%': {\n backgroundPosition: '-200% 0',\n },\n '100%': {\n backgroundPosition: '200% 0',\n },\n },\n '.jiwambe-skeleton': {\n backgroundColor: 'var(--col-neutral-100)',\n backgroundImage: [\n 'linear-gradient(',\n ' 90deg,',\n ' var(--col-neutral-100) 25%,',\n ' var(--col-neutral-50) 50%,',\n ' var(--col-neutral-100) 75%',\n ')',\n ].join(''),\n backgroundSize: '200% 100%',\n backgroundRepeat: 'no-repeat',\n animation: 'jiwambe-shimmer 1.5s ease-in-out infinite',\n },\n });\n\n // -----------------------------------------------------------------\n // 1c. List marker base styles\n // -----------------------------------------------------------------\n\n addBase({\n '.jiwambe-list': {\n paddingLeft: 'var(--space-6)',\n margin: '0',\n },\n '.jiwambe-list--unstyled': {\n paddingLeft: '0',\n listStyle: 'none',\n },\n '.jiwambe-list--disc li::marker': {\n color: 'var(--col-text-secondary)',\n },\n '.jiwambe-list--decimal li::marker': {\n color: 'var(--col-text-secondary)',\n fontVariantNumeric: 'tabular-nums',\n },\n '.jiwambe-list--none': {\n listStyle: 'none',\n paddingLeft: '0',\n },\n '.jiwambe-list-item': {\n paddingLeft: 'var(--space-1)',\n },\n '.jiwambe-list-item + .jiwambe-list-item': {\n marginTop: 'var(--space-0)',\n },\n });\n\n // -----------------------------------------------------------------\n // 2. Typography utility classes\n // -----------------------------------------------------------------\n\n const typographyUtilities: Record<string, Record<string, string>> = {};\n\n for (const [name, def] of Object.entries(mergedTypography)) {\n const styles: Record<string, string> = {\n 'font-family': def.fontFamily,\n 'font-size': def.fontSize,\n 'font-weight': def.fontWeight,\n 'line-height': def.lineHeight,\n };\n if (def.letterSpacing) styles['letter-spacing'] = def.letterSpacing;\n if (def.textWrap) styles['text-wrap'] = def.textWrap;\n\n typographyUtilities[`.text-${name}`] = styles;\n }\n\n addUtilities(typographyUtilities);\n };\n },\n (options) => {\n const fonts = resolvedFontFamilies(options);\n const mergedColors = { ...defaultSemanticColors(), ...(options?.colors ?? {}) };\n const mergedSpacing = { ...spacingTokens, ...(options?.spacing ?? {}) };\n const mergedBorderWidth = { ...borderWidthTokens, ...(options?.borderWidth ?? {}) };\n const mergedBorderRadius = { ...borderRadiusTokens, ...(options?.borderRadius ?? {}) };\n const mergedElevation = { ...elevationTokens, ...(options?.elevation ?? {}) };\n\n const allColors: Record<string, string> = {};\n for (const [key, value] of Object.entries(baseColors)) {\n allColors[key] = value;\n }\n for (const [key, value] of Object.entries(mergedColors)) {\n allColors[key] = value;\n }\n\n // Spacing theme: each token maps to var(--token) so utilities use CSS variables.\n // Add short keys for fluid tokens so px-fluid-4-9 works alongside px-space-fluid-4-9.\n const spacingExtension: Record<string, string> = {};\n for (const key of Object.keys(mergedSpacing)) {\n spacingExtension[key] = `var(--${key})`;\n if (key.startsWith('space-fluid-')) {\n const shortKey = key.replace(/^space-/, '');\n spacingExtension[shortKey] = `var(--${key})`;\n }\n }\n\n return {\n theme: {\n screens,\n extend: {\n colors: allColors,\n spacing: spacingExtension,\n borderWidth: mergedBorderWidth,\n borderRadius: mergedBorderRadius,\n boxShadow: mergedElevation,\n fontFamily: {\n primary: [fonts.primary],\n secondary: [fonts.secondary],\n },\n },\n },\n };\n },\n);\n\nexport default jiwambePlugin;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jiwambe/components",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -63,27 +63,27 @@
63
63
  "react-dom": "^19.0.0"
64
64
  },
65
65
  "dependencies": {
66
- "next": "^15.0.0 || ^16.0.0",
67
- "tailwindcss": "^3.4.0"
66
+ "next": "^16.1.6",
67
+ "tailwindcss": "^3.4.19"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@changesets/cli": "^2.30.0",
71
- "@testing-library/jest-dom": "^6.6.3",
72
- "@testing-library/react": "^16.0.0",
73
- "@types/react": "^19.0.0",
74
- "@types/react-dom": "^19.0.0",
75
- "@vitejs/plugin-react": "^4.0.0",
76
- "autoprefixer": "^10.4.0",
77
- "happy-dom": "^15.0.0",
71
+ "@testing-library/jest-dom": "^6.9.1",
72
+ "@testing-library/react": "^16.3.2",
73
+ "@types/react": "^19.2.14",
74
+ "@types/react-dom": "^19.2.3",
75
+ "@vitejs/plugin-react": "^4.7.0",
76
+ "autoprefixer": "^10.4.27",
77
+ "happy-dom": "^15.11.7",
78
78
  "jest-axe": "^9.0.0",
79
- "postcss": "^8.4.0",
80
- "react": "^19.0.0",
81
- "react-dom": "^19.0.0",
79
+ "postcss": "^8.5.8",
80
+ "react": "^19.2.4",
81
+ "react-dom": "^19.2.4",
82
82
  "rollup-plugin-preserve-directives": "^0.4.0",
83
- "typescript": "^5.0.0",
84
- "vite": "^5.0.0",
85
- "vite-plugin-dts": "^4.0.0",
86
- "vitest": "^2.0.0"
83
+ "typescript": "^5.9.3",
84
+ "vite": "^5.4.21",
85
+ "vite-plugin-dts": "^4.5.4",
86
+ "vitest": "^2.1.9"
87
87
  },
88
88
  "scripts": {
89
89
  "build": "tsc --noEmit && vite build",