@alfadocs/ui-kit-debug 1.130.1 → 1.130.2
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/dist/_chunks/{actions-cell-renderer-DTaIQKp9.js → actions-cell-renderer-C-l_ppP6.js} +3 -3
- package/dist/_chunks/{actions-cell-renderer-DTaIQKp9.js.map → actions-cell-renderer-C-l_ppP6.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-BBxbMRmX.js → alia-sidebar-CK1zw_Bc.js} +2 -2
- package/dist/_chunks/{alia-sidebar-BBxbMRmX.js.map → alia-sidebar-CK1zw_Bc.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js → anamnesis-summary-rows-CCNmkq55.js} +5 -5
- package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js.map → anamnesis-summary-rows-CCNmkq55.js.map} +1 -1
- package/dist/_chunks/{appointment-card-vbUsDh70.js → appointment-card-OAOur8lH.js} +2 -2
- package/dist/_chunks/{appointment-card-vbUsDh70.js.map → appointment-card-OAOur8lH.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-DdUhqfEi.js → appointment-peek-DZa6xyUb.js} +2 -2
- package/dist/_chunks/{appointment-peek-DdUhqfEi.js.map → appointment-peek-DZa6xyUb.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-B5pfBl-b.js → appointment-timeline-DQePqpyH.js} +3 -3
- package/dist/_chunks/{appointment-timeline-B5pfBl-b.js.map → appointment-timeline-DQePqpyH.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-BhiXetjs.js → appointment-tray-DSFqO5Rm.js} +2 -2
- package/dist/_chunks/{appointment-tray-BhiXetjs.js.map → appointment-tray-DSFqO5Rm.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js → balance-badge-cell-DTiMdnCZ.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js.map → balance-badge-cell-DTiMdnCZ.js.map} +1 -1
- package/dist/_chunks/body-pointer-lock-CsOEDm1I.js +15 -0
- package/dist/_chunks/body-pointer-lock-CsOEDm1I.js.map +1 -0
- package/dist/_chunks/{button-group-B2MJo0Se.js → button-group-DuQuuulC.js} +2 -2
- package/dist/_chunks/{button-group-B2MJo0Se.js.map → button-group-DuQuuulC.js.map} +1 -1
- package/dist/_chunks/{calculator-dialog-BGX5XQCM.js → calculator-dialog-Cg3GjaRf.js} +2 -2
- package/dist/_chunks/{calculator-dialog-BGX5XQCM.js.map → calculator-dialog-Cg3GjaRf.js.map} +1 -1
- package/dist/_chunks/{calendar-DzR-vdJ5.js → calendar-BIoOeBTT.js} +103 -103
- package/dist/_chunks/{calendar-DzR-vdJ5.js.map → calendar-BIoOeBTT.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js → calendar-appointment-editor-dialog-WW6V1SGh.js} +15 -15
- package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js.map → calendar-appointment-editor-dialog-WW6V1SGh.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-CwgkImOD.js → care-plan-card-DKScH9Ss.js} +2 -2
- package/dist/_chunks/{care-plan-card-CwgkImOD.js.map → care-plan-card-DKScH9Ss.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-cdojypxu.js → care-plan-entry-card-AG1y3nyW.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-cdojypxu.js.map → care-plan-entry-card-AG1y3nyW.js.map} +1 -1
- package/dist/_chunks/{chart-Aue_2dMb.js → chart-D0EeFWst.js} +2 -2
- package/dist/_chunks/{chart-Aue_2dMb.js.map → chart-D0EeFWst.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-CaxgaEgI.js → dashboard-grid-2uVXEe9e.js} +2 -2
- package/dist/_chunks/{dashboard-grid-CaxgaEgI.js.map → dashboard-grid-2uVXEe9e.js.map} +1 -1
- package/dist/_chunks/{data-table-BCfkcPti.js → data-table-FTV3uRjX.js} +3 -3
- package/dist/_chunks/{data-table-BCfkcPti.js.map → data-table-FTV3uRjX.js.map} +1 -1
- package/dist/_chunks/{default-tabs-BnB6FUEW.js → default-tabs-BryvhiHv.js} +4 -4
- package/dist/_chunks/{default-tabs-BnB6FUEW.js.map → default-tabs-BryvhiHv.js.map} +1 -1
- package/dist/_chunks/{dialog-CIUn5oLb.js → dialog-CVTxyR0v.js} +48 -47
- package/dist/_chunks/dialog-CVTxyR0v.js.map +1 -0
- package/dist/_chunks/{document-preview-BWDTCEHI.js → document-preview-_kQ9QvZV.js} +2 -2
- package/dist/_chunks/{document-preview-BWDTCEHI.js.map → document-preview-_kQ9QvZV.js.map} +1 -1
- package/dist/_chunks/{dropdown-menu-Dw6sgQwJ.js → dropdown-menu-DBWaW4pq.js} +92 -88
- package/dist/_chunks/dropdown-menu-DBWaW4pq.js.map +1 -0
- package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js → editable-currency-cell-renderer-CZMQ5xRT.js} +2 -2
- package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js.map → editable-currency-cell-renderer-CZMQ5xRT.js.map} +1 -1
- package/dist/_chunks/{face-scheme-Bt07zQJU.js → face-scheme-D_Y1StPl.js} +3 -3
- package/dist/_chunks/{face-scheme-Bt07zQJU.js.map → face-scheme-D_Y1StPl.js.map} +1 -1
- package/dist/_chunks/{file-manager-Dpwv0qs-.js → file-manager-Bzr5NK1t.js} +5 -5
- package/dist/_chunks/{file-manager-Dpwv0qs-.js.map → file-manager-Bzr5NK1t.js.map} +1 -1
- package/dist/_chunks/{header-settings-ZGvYAuKF.js → header-settings-Cu-MKOsO.js} +2 -2
- package/dist/_chunks/{header-settings-ZGvYAuKF.js.map → header-settings-Cu-MKOsO.js.map} +1 -1
- package/dist/_chunks/{heatmap-Ds5DJBUL.js → heatmap-C5gJin_F.js} +3 -3
- package/dist/_chunks/{heatmap-Ds5DJBUL.js.map → heatmap-C5gJin_F.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-C28E_rOt.js → help-me-write-templates-DO6vJeP4.js} +2 -2
- package/dist/_chunks/{help-me-write-templates-C28E_rOt.js.map → help-me-write-templates-DO6vJeP4.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-BKtkVZ1W.js → icon-button-group-SmkdVCNx.js} +2 -2
- package/dist/_chunks/{icon-button-group-BKtkVZ1W.js.map → icon-button-group-SmkdVCNx.js.map} +1 -1
- package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js → invoice-upload-list-868v1oDe.js} +3 -3
- package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js.map → invoice-upload-list-868v1oDe.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-CC9VHU68.js → link-cell-renderer-D3JLPURZ.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-CC9VHU68.js.map → link-cell-renderer-D3JLPURZ.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js → marketplace-app-shell-dMmxI6MT.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js.map → marketplace-app-shell-dMmxI6MT.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js → muscle-scheme-BGJD62op.js} +2 -2
- package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js.map → muscle-scheme-BGJD62op.js.map} +1 -1
- package/dist/_chunks/{notes-panel-DIY7eNsq.js → notes-panel-Cm-_pCRJ.js} +3 -3
- package/dist/_chunks/{notes-panel-DIY7eNsq.js.map → notes-panel-Cm-_pCRJ.js.map} +1 -1
- package/dist/_chunks/{parts-tGzYz0uG.js → parts-BOnDDU3E.js} +2 -2
- package/dist/_chunks/{parts-tGzYz0uG.js.map → parts-BOnDDU3E.js.map} +1 -1
- package/dist/_chunks/{patient-search-OAwFgOW3.js → patient-search-DBvLFArV.js} +2 -2
- package/dist/_chunks/{patient-search-OAwFgOW3.js.map → patient-search-DBvLFArV.js.map} +1 -1
- package/dist/_chunks/{practice-results-BDnZtbDM.js → practice-results-M5A9-X9y.js} +3 -3
- package/dist/_chunks/{practice-results-BDnZtbDM.js.map → practice-results-M5A9-X9y.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-Db4wm6_S.js → public-header.agent-DaeDfLfy.js} +2 -2
- package/dist/_chunks/{public-header.agent-Db4wm6_S.js.map → public-header.agent-DaeDfLfy.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js → radiograph-panel.agent-88VjqlG7.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js.map → radiograph-panel.agent-88VjqlG7.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-TnX0SYdq.js → rich-text-editor-DjHL1b3E.js} +3 -3
- package/dist/_chunks/{rich-text-editor-TnX0SYdq.js.map → rich-text-editor-DjHL1b3E.js.map} +1 -1
- package/dist/_chunks/{row-actions-Dpf9CrCP.js → row-actions-BF2-uizV.js} +3 -3
- package/dist/_chunks/{row-actions-Dpf9CrCP.js.map → row-actions-BF2-uizV.js.map} +1 -1
- package/dist/_chunks/{sheet-uZZXaO_S.js → sheet-BdhYeQQT.js} +84 -72
- package/dist/_chunks/sheet-BdhYeQQT.js.map +1 -0
- package/dist/_chunks/{signature-request-DW2PSp66.js → signature-request-4pGq3YBe.js} +3 -3
- package/dist/_chunks/{signature-request-DW2PSp66.js.map → signature-request-4pGq3YBe.js.map} +1 -1
- package/dist/_chunks/{tab-bar-CF8R38Og.js → tab-bar-CeC2QOwB.js} +2 -2
- package/dist/_chunks/{tab-bar-CF8R38Og.js.map → tab-bar-CeC2QOwB.js.map} +1 -1
- package/dist/_chunks/{tabs-P4qFmxk5.js → tabs-CRIDBLP7.js} +2 -2
- package/dist/_chunks/{tabs-P4qFmxk5.js.map → tabs-CRIDBLP7.js.map} +1 -1
- package/dist/_chunks/{task-editor-CVRrDqpe.js → task-editor-BL2hHxNz.js} +3 -3
- package/dist/_chunks/{task-editor-CVRrDqpe.js.map → task-editor-BL2hHxNz.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DBSm3WjK.js → tasks-panel-BE3zaayj.js} +2 -2
- package/dist/_chunks/{tasks-panel-DBSm3WjK.js.map → tasks-panel-BE3zaayj.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-CeKl8f_f.js → theme-toggle-BQDFxvVS.js} +3 -3
- package/dist/_chunks/{theme-toggle-CeKl8f_f.js.map → theme-toggle-BQDFxvVS.js.map} +1 -1
- package/dist/_chunks/{token-insert-menu-BrK5NQIq.js → token-insert-menu-BLtfMTJd.js} +2 -2
- package/dist/_chunks/{token-insert-menu-BrK5NQIq.js.map → token-insert-menu-BLtfMTJd.js.map} +1 -1
- package/dist/_chunks/{toolbar-CC-Ls_eC.js → toolbar-BK6S9PhI.js} +2 -2
- package/dist/_chunks/{toolbar-CC-Ls_eC.js.map → toolbar-BK6S9PhI.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme-DHRxV2sE.js → tooth-scheme-BtnFgugP.js} +2 -2
- package/dist/_chunks/{tooth-scheme-DHRxV2sE.js.map → tooth-scheme-BtnFgugP.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js → use-appointment-details-read-_b7FRB1x.js} +4 -4
- package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js.map → use-appointment-details-read-_b7FRB1x.js.map} +1 -1
- package/dist/_chunks/{verify-identity-types-D_LdByCp.js → verify-identity-types-CxtrBXsZ.js} +2 -2
- package/dist/_chunks/{verify-identity-types-D_LdByCp.js.map → verify-identity-types-CxtrBXsZ.js.map} +1 -1
- package/dist/_chunks/{widget-picker-DrxJjEkv.js → widget-picker-D3T7e8a4.js} +2 -2
- package/dist/_chunks/{widget-picker-DrxJjEkv.js.map → widget-picker-D3T7e8a4.js.map} +1 -1
- package/dist/_chunks/{workflow-map-DCjkRuS_.js → workflow-map-DaZFP9SJ.js} +2 -2
- package/dist/_chunks/{workflow-map-DCjkRuS_.js.map → workflow-map-DaZFP9SJ.js.map} +1 -1
- package/dist/_chunks/{workflow-status-D0avpoeS.js → workflow-status-D1WgGVTP.js} +2 -2
- package/dist/_chunks/{workflow-status-D0avpoeS.js.map → workflow-status-D1WgGVTP.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js → workflow-webhook-action-BsGSh3h9.js} +2 -2
- package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js.map → workflow-webhook-action-BsGSh3h9.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/browser-support.js +1 -1
- package/dist/components/_shared/body-pointer-lock.d.ts +2 -0
- package/dist/components/_shared/body-pointer-lock.d.ts.map +1 -0
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/bill-table/index.js +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calculator-dialog/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-grid/index.js +1 -1
- package/dist/components/data-table/index.js +4 -4
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/invoice-upload-list/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/row-actions/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sheet/sheet.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/index.js +54 -54
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/verify-identity/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/package.json +1 -1
- package/dist/_chunks/dialog-CIUn5oLb.js.map +0 -1
- package/dist/_chunks/dropdown-menu-Dw6sgQwJ.js.map +0 -1
- package/dist/_chunks/sheet-uZZXaO_S.js.map +0 -1
|
@@ -3,9 +3,9 @@ import { forwardRef as M, useRef as k, useImperativeHandle as N, useMemo as P, u
|
|
|
3
3
|
import { c as _ } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as u } from "react-i18next";
|
|
5
5
|
import { I as T } from "./icon-button-S8_weU3g.js";
|
|
6
|
-
import { I as j } from "./icon-button-group-
|
|
6
|
+
import { I as j } from "./icon-button-group-SmkdVCNx.js";
|
|
7
7
|
import { S as x } from "./switch-DO6uC4HJ.js";
|
|
8
|
-
import { D as o } from "./dropdown-menu-
|
|
8
|
+
import { D as o } from "./dropdown-menu-DBWaW4pq.js";
|
|
9
9
|
import { u as K } from "./use-theme-CYGyzFgZ.js";
|
|
10
10
|
import { u as L } from "./registry-DvAUVLHh.js";
|
|
11
11
|
import { u as z } from "./length-token-DwMnGEYT.js";
|
|
@@ -373,4 +373,4 @@ export {
|
|
|
373
373
|
O as T,
|
|
374
374
|
D as t
|
|
375
375
|
};
|
|
376
|
-
//# sourceMappingURL=theme-toggle-
|
|
376
|
+
//# sourceMappingURL=theme-toggle-BQDFxvVS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-toggle-CeKl8f_f.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\nimport { useLengthTokenPx } from '../_shared/length-token';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation('ui');\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation('ui');\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.RefObject<HTMLDivElement | null>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n // Same edge margin as HeaderSettings: inside the phone menu the panel\n // keeps the sheet's side margin instead of touching the screen edge.\n const edgeMargin = useLengthTokenPx('--spacing-lg', forwardedRef, 24);\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n sideOffset={8}\n collisionPadding={edgeMargin}\n >\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","edgeMargin","useLengthTokenPx","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme-toggle-BQDFxvVS.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\nimport { useLengthTokenPx } from '../_shared/length-token';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation('ui');\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation('ui');\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.RefObject<HTMLDivElement | null>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n // Same edge margin as HeaderSettings: inside the phone menu the panel\n // keeps the sheet's side margin instead of touching the screen edge.\n const edgeMargin = useLengthTokenPx('--spacing-lg', forwardedRef, 24);\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n sideOffset={8}\n collisionPadding={edgeMargin}\n >\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation('ui');\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","edgeMargin","useLengthTokenPx","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as d, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as v, useState as O, useRef as w, useEffect as x, useMemo as y, Fragment as R } from "react";
|
|
3
3
|
import { B as S } from "./button-DohK_Ak_.js";
|
|
4
|
-
import { D as r } from "./dropdown-menu-
|
|
4
|
+
import { D as r } from "./dropdown-menu-DBWaW4pq.js";
|
|
5
5
|
import { u as C } from "./registry-DvAUVLHh.js";
|
|
6
6
|
const K = {
|
|
7
7
|
id: "token-insert-menu",
|
|
@@ -144,4 +144,4 @@ export {
|
|
|
144
144
|
j as T,
|
|
145
145
|
K as t
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=token-insert-menu-
|
|
147
|
+
//# sourceMappingURL=token-insert-menu-BLtfMTJd.js.map
|
package/dist/_chunks/{token-insert-menu-BrK5NQIq.js.map → token-insert-menu-BLtfMTJd.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-insert-menu-BrK5NQIq.js","sources":["../../src/components/token-insert-menu/token-insert-menu.agent.ts","../../src/components/token-insert-menu/token-insert-menu.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TokenInsertMenu. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TokenInsertMenuHandle } from './token-insert-menu';\n\nexport const tokenInsertMenuAgent: AgentAdapter<TokenInsertMenuHandle> = {\n id: 'token-insert-menu',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.tokenInsertMenu.state.isOpen',\n description: 'True when the token menu is currently open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.open',\n description: 'Open the token menu.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.close',\n description: 'Close the token menu.',\n invoke: (handle) => {\n handle.close();\n },\n },\n insert: {\n safety: 'write',\n argsType: '{ token: string }',\n argsSchema: {\n type: 'object',\n properties: { token: { type: 'string' } },\n required: ['token'],\n },\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.insert',\n description: 'Emit a merge-token to the consumer for cursor insertion.',\n examples: [\n {\n args: { token: '{{patient.name}}' },\n note: 'Emit the patient-name placeholder for cursor insertion.',\n },\n ],\n invoke: (handle, args: { token: string }) => {\n handle.insert(args.token);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'token-insert-menu',\n description: 'Marks the TokenInsertMenu wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n Fragment,\n} from 'react';\nimport { Button } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { useAgentRegistration } from '../../agent';\nimport { tokenInsertMenuAgent } from './token-insert-menu.agent';\n\n/** One selectable merge-token. */\nexport interface TokenInsertMenuToken {\n /** Raw token text inserted verbatim (e.g. `\"{{patient.name}}\"`). */\n value: string;\n /** Human-readable label shown in the menu. Already localised by the consumer. */\n label: string;\n /** Optional section heading — when ANY token has one, the menu renders grouped. */\n group?: string;\n}\n\n/** Agent-readiness curated handle for TokenInsertMenu. */\nexport interface TokenInsertMenuHandle {\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n /** Emit a token to the consumer (mirrors a user selecting it). */\n insert: (token: string) => void;\n}\n\nexport interface TokenInsertMenuProps {\n /** The merge-tokens to offer. `value` is inserted; `label` is shown. */\n tokens: TokenInsertMenuToken[];\n /** Called with the chosen token's raw `value`. The consumer inserts it at\n * the caret of their target field — this component never owns the field. */\n onInsert: (token: string) => void;\n /** The trigger button's visible text (already localised by the consumer). */\n triggerLabel: string;\n disabled?: boolean;\n /** Opaque instance id — surfaced as `data-component-id` + agent instance id. */\n id?: string;\n /** Extra classes for the trigger button. */\n className?: string;\n}\n\ninterface TokenSection {\n heading: string;\n items: TokenInsertMenuToken[];\n}\n\nexport const TokenInsertMenu = forwardRef<\n HTMLButtonElement,\n TokenInsertMenuProps\n>(function TokenInsertMenu(\n { tokens, onInsert, triggerLabel, disabled, id, className },\n ref,\n) {\n const [open, setOpen] = useState(false);\n\n // Mirror the open flag into a ref so the agent handle reads a fresh value\n // without re-subscribing on every toggle (matches DropdownMenu.Root).\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n // Group tokens only when at least one carries a `group`; otherwise flat.\n const sections = useMemo<TokenSection[] | null>(() => {\n if (!tokens.some((token) => token.group)) return null;\n const order: string[] = [];\n const byGroup = new Map<string, TokenInsertMenuToken[]>();\n for (const token of tokens) {\n const key = token.group ?? '';\n const bucket = byGroup.get(key);\n if (bucket) {\n bucket.push(token);\n } else {\n byGroup.set(key, [token]);\n order.push(key);\n }\n }\n return order.map((heading) => ({\n heading,\n items: byGroup.get(heading) ?? [],\n }));\n }, [tokens]);\n\n const handle = useMemo<TokenInsertMenuHandle>(\n () => ({\n isOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n insert: (token) => onInsert(token),\n }),\n [onInsert],\n );\n useAgentRegistration(tokenInsertMenuAgent, handle, id);\n\n const renderItem = (token: TokenInsertMenuToken) => (\n <DropdownMenu.Item\n key={token.value}\n // Raw token shown as a muted monospace hint beneath the label.\n description={\n <span className=\"ds:font-mono ds:text-muted-foreground\">\n {token.value}\n </span>\n }\n onSelect={() => onInsert(token.value)}\n >\n {token.label}\n </DropdownMenu.Item>\n );\n\n return (\n <DropdownMenu.Root\n open={open}\n // `asChild` hides the trigger's native `disabled` from Radix, so gate\n // opening here too — a disabled menu must never expand on interaction.\n onOpenChange={(next) => {\n if (disabled) return;\n setOpen(next);\n }}\n >\n <span\n className=\"ds:inline-flex\"\n data-component=\"token-insert-menu\"\n data-component-id={id}\n >\n <DropdownMenu.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n className={className}\n >\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n </span>\n <DropdownMenu.Content align=\"start\">\n {sections\n ? sections.map((section, index) => (\n <Fragment key={section.heading || `section-${index}`}>\n {index > 0 ? <DropdownMenu.Separator /> : null}\n <DropdownMenu.Group>\n {section.heading ? (\n <DropdownMenu.Label>{section.heading}</DropdownMenu.Label>\n ) : null}\n {section.items.map(renderItem)}\n </DropdownMenu.Group>\n </Fragment>\n ))\n : tokens.map(renderItem)}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n});\n\nTokenInsertMenu.displayName = 'TokenInsertMenu';\n"],"names":["tokenInsertMenuAgent","handle","args","TokenInsertMenu","forwardRef","tokens","onInsert","triggerLabel","disabled","id","className","ref","open","setOpen","useState","openRef","useRef","useEffect","sections","useMemo","token","order","byGroup","key","bucket","heading","useAgentRegistration","renderItem","jsx","DropdownMenu","jsxs","next","Button","section","index","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token-insert-menu-BLtfMTJd.js","sources":["../../src/components/token-insert-menu/token-insert-menu.agent.ts","../../src/components/token-insert-menu/token-insert-menu.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TokenInsertMenu. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TokenInsertMenuHandle } from './token-insert-menu';\n\nexport const tokenInsertMenuAgent: AgentAdapter<TokenInsertMenuHandle> = {\n id: 'token-insert-menu',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.tokenInsertMenu.state.isOpen',\n description: 'True when the token menu is currently open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.open',\n description: 'Open the token menu.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.close',\n description: 'Close the token menu.',\n invoke: (handle) => {\n handle.close();\n },\n },\n insert: {\n safety: 'write',\n argsType: '{ token: string }',\n argsSchema: {\n type: 'object',\n properties: { token: { type: 'string' } },\n required: ['token'],\n },\n descriptionKey: 'ui.agent.tokenInsertMenu.actions.insert',\n description: 'Emit a merge-token to the consumer for cursor insertion.',\n examples: [\n {\n args: { token: '{{patient.name}}' },\n note: 'Emit the patient-name placeholder for cursor insertion.',\n },\n ],\n invoke: (handle, args: { token: string }) => {\n handle.insert(args.token);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'token-insert-menu',\n description: 'Marks the TokenInsertMenu wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n Fragment,\n} from 'react';\nimport { Button } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { useAgentRegistration } from '../../agent';\nimport { tokenInsertMenuAgent } from './token-insert-menu.agent';\n\n/** One selectable merge-token. */\nexport interface TokenInsertMenuToken {\n /** Raw token text inserted verbatim (e.g. `\"{{patient.name}}\"`). */\n value: string;\n /** Human-readable label shown in the menu. Already localised by the consumer. */\n label: string;\n /** Optional section heading — when ANY token has one, the menu renders grouped. */\n group?: string;\n}\n\n/** Agent-readiness curated handle for TokenInsertMenu. */\nexport interface TokenInsertMenuHandle {\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n /** Emit a token to the consumer (mirrors a user selecting it). */\n insert: (token: string) => void;\n}\n\nexport interface TokenInsertMenuProps {\n /** The merge-tokens to offer. `value` is inserted; `label` is shown. */\n tokens: TokenInsertMenuToken[];\n /** Called with the chosen token's raw `value`. The consumer inserts it at\n * the caret of their target field — this component never owns the field. */\n onInsert: (token: string) => void;\n /** The trigger button's visible text (already localised by the consumer). */\n triggerLabel: string;\n disabled?: boolean;\n /** Opaque instance id — surfaced as `data-component-id` + agent instance id. */\n id?: string;\n /** Extra classes for the trigger button. */\n className?: string;\n}\n\ninterface TokenSection {\n heading: string;\n items: TokenInsertMenuToken[];\n}\n\nexport const TokenInsertMenu = forwardRef<\n HTMLButtonElement,\n TokenInsertMenuProps\n>(function TokenInsertMenu(\n { tokens, onInsert, triggerLabel, disabled, id, className },\n ref,\n) {\n const [open, setOpen] = useState(false);\n\n // Mirror the open flag into a ref so the agent handle reads a fresh value\n // without re-subscribing on every toggle (matches DropdownMenu.Root).\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n // Group tokens only when at least one carries a `group`; otherwise flat.\n const sections = useMemo<TokenSection[] | null>(() => {\n if (!tokens.some((token) => token.group)) return null;\n const order: string[] = [];\n const byGroup = new Map<string, TokenInsertMenuToken[]>();\n for (const token of tokens) {\n const key = token.group ?? '';\n const bucket = byGroup.get(key);\n if (bucket) {\n bucket.push(token);\n } else {\n byGroup.set(key, [token]);\n order.push(key);\n }\n }\n return order.map((heading) => ({\n heading,\n items: byGroup.get(heading) ?? [],\n }));\n }, [tokens]);\n\n const handle = useMemo<TokenInsertMenuHandle>(\n () => ({\n isOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n insert: (token) => onInsert(token),\n }),\n [onInsert],\n );\n useAgentRegistration(tokenInsertMenuAgent, handle, id);\n\n const renderItem = (token: TokenInsertMenuToken) => (\n <DropdownMenu.Item\n key={token.value}\n // Raw token shown as a muted monospace hint beneath the label.\n description={\n <span className=\"ds:font-mono ds:text-muted-foreground\">\n {token.value}\n </span>\n }\n onSelect={() => onInsert(token.value)}\n >\n {token.label}\n </DropdownMenu.Item>\n );\n\n return (\n <DropdownMenu.Root\n open={open}\n // `asChild` hides the trigger's native `disabled` from Radix, so gate\n // opening here too — a disabled menu must never expand on interaction.\n onOpenChange={(next) => {\n if (disabled) return;\n setOpen(next);\n }}\n >\n <span\n className=\"ds:inline-flex\"\n data-component=\"token-insert-menu\"\n data-component-id={id}\n >\n <DropdownMenu.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n className={className}\n >\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n </span>\n <DropdownMenu.Content align=\"start\">\n {sections\n ? sections.map((section, index) => (\n <Fragment key={section.heading || `section-${index}`}>\n {index > 0 ? <DropdownMenu.Separator /> : null}\n <DropdownMenu.Group>\n {section.heading ? (\n <DropdownMenu.Label>{section.heading}</DropdownMenu.Label>\n ) : null}\n {section.items.map(renderItem)}\n </DropdownMenu.Group>\n </Fragment>\n ))\n : tokens.map(renderItem)}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n});\n\nTokenInsertMenu.displayName = 'TokenInsertMenu';\n"],"names":["tokenInsertMenuAgent","handle","args","TokenInsertMenu","forwardRef","tokens","onInsert","triggerLabel","disabled","id","className","ref","open","setOpen","useState","openRef","useRef","useEffect","sections","useMemo","token","order","byGroup","key","bucket","heading","useAgentRegistration","renderItem","jsx","DropdownMenu","jsxs","next","Button","section","index","Fragment"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import { useState as M, useEffect as G, forwardRef as m, useCallback as w } from "react";
|
|
3
3
|
import { useTranslation as I } from "react-i18next";
|
|
4
|
-
import { T as v, c as N, a as R } from "./parts-
|
|
4
|
+
import { T as v, c as N, a as R } from "./parts-BOnDDU3E.js";
|
|
5
5
|
import { e as k, s as P, w as A, a as B } from "./export-files-BByoK9Cg.js";
|
|
6
6
|
import { i as O } from "./is-development-CLUAnsU7.js";
|
|
7
7
|
import { d as j, g as Q, u as _ } from "./grid-context-jn9y8tNE.js";
|
|
@@ -156,4 +156,4 @@ export {
|
|
|
156
156
|
Z as D,
|
|
157
157
|
Y as a
|
|
158
158
|
};
|
|
159
|
-
//# sourceMappingURL=toolbar-
|
|
159
|
+
//# sourceMappingURL=toolbar-BK6S9PhI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-CC-Ls_eC.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toolbar-BK6S9PhI.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { c as re } from "./index-D2ZczOXr.js";
|
|
|
6
6
|
import { useTranslation as oo } from "react-i18next";
|
|
7
7
|
import { u as Go } from "./registry-DvAUVLHh.js";
|
|
8
8
|
import { I as Qo } from "./icon-button-S8_weU3g.js";
|
|
9
|
-
import { D as H } from "./dropdown-menu-
|
|
9
|
+
import { D as H } from "./dropdown-menu-DBWaW4pq.js";
|
|
10
10
|
import { S as Zo } from "./switch-DO6uC4HJ.js";
|
|
11
11
|
import { o as Ut, K as Xo, a0 as Jo, J as Ue, R as Ye, u as no, U as io, G as en, S as tn, w as Be, X as F, f as le, $ as at, _ as Yt, E as ut, a1 as de, H as zt, z as lt, y as on, l as st, A as ro, L as nn, t as ht, W as ct, s as ao, Y as so, x as rn, V as an, a2 as sn, a3 as $, a4 as U, a5 as cn, Z as dn, C as co, Q as ln, a6 as hn, k as Vt, T as un, O as pn, q as fn, N as mn } from "./tooth-data-DR8Kdnup.js";
|
|
12
12
|
import { S as gn } from "./settings-d25ju_6L.js";
|
|
@@ -1993,4 +1993,4 @@ export {
|
|
|
1993
1993
|
On as r,
|
|
1994
1994
|
_n as t
|
|
1995
1995
|
};
|
|
1996
|
-
//# sourceMappingURL=tooth-scheme-
|
|
1996
|
+
//# sourceMappingURL=tooth-scheme-BtnFgugP.js.map
|