@intlayer/design-system 8.5.0 → 8.5.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/esm/components/ContentEditor/ContentEditorTextArea.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +2 -2
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +3 -3
- package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
- package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +2 -2
- package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +1 -1
- package/dist/esm/components/Form/elements/OTPElement.mjs +1 -1
- package/dist/esm/components/IDE/CopyCode.mjs +5 -2
- package/dist/esm/components/IDE/CopyCode.mjs.map +1 -1
- package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +1 -1
- package/dist/esm/components/Modal/Modal.mjs +2 -2
- package/dist/esm/components/Navbar/MobileNavbar.mjs +1 -1
- package/dist/esm/components/Pagination/Pagination.mjs +1 -1
- package/dist/esm/components/RightDrawer/RightDrawer.mjs +3 -3
- package/dist/esm/components/Table/ExpandButton.mjs +41 -0
- package/dist/esm/components/Table/ExpandButton.mjs.map +1 -0
- package/dist/esm/components/Table/Table.mjs +37 -51
- package/dist/esm/components/Table/Table.mjs.map +1 -1
- package/dist/esm/components/Table/table.content.mjs +42 -20
- package/dist/esm/components/Table/table.content.mjs.map +1 -1
- package/dist/esm/components/Table/useTableWidths.mjs +41 -0
- package/dist/esm/components/Table/useTableWidths.mjs.map +1 -0
- package/dist/esm/components/TechLogo/TechLogo.mjs +57 -0
- package/dist/esm/components/TechLogo/TechLogo.mjs.map +1 -0
- package/dist/esm/components/TechLogo/index.mjs +5 -0
- package/dist/esm/components/TechLogo/logos/Adonis.mjs +25 -0
- package/dist/esm/components/TechLogo/logos/Adonis.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Angular.mjs +30 -0
- package/dist/esm/components/TechLogo/logos/Angular.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Anthropic.mjs +26 -0
- package/dist/esm/components/TechLogo/logos/Anthropic.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Astro.mjs +41 -0
- package/dist/esm/components/TechLogo/logos/Astro.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/ChatGPT.mjs +19 -0
- package/dist/esm/components/TechLogo/logos/ChatGPT.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Claude.mjs +18 -0
- package/dist/esm/components/TechLogo/logos/Claude.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/DeepSeek.mjs +21 -0
- package/dist/esm/components/TechLogo/logos/DeepSeek.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Express.mjs +24 -0
- package/dist/esm/components/TechLogo/logos/Express.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Fastify.mjs +18 -0
- package/dist/esm/components/TechLogo/logos/Fastify.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Gemini.mjs +16 -0
- package/dist/esm/components/TechLogo/logos/Gemini.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/GoogleAI.mjs +20 -0
- package/dist/esm/components/TechLogo/logos/GoogleAI.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Grok.mjs +18 -0
- package/dist/esm/components/TechLogo/logos/Grok.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Hono.mjs +22 -0
- package/dist/esm/components/TechLogo/logos/Hono.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Lit.mjs +32 -0
- package/dist/esm/components/TechLogo/logos/Lit.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Lynx.mjs +43 -0
- package/dist/esm/components/TechLogo/logos/Lynx.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Mistral.mjs +62 -0
- package/dist/esm/components/TechLogo/logos/Mistral.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/NestJS.mjs +22 -0
- package/dist/esm/components/TechLogo/logos/NestJS.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Nextjs.mjs +23 -0
- package/dist/esm/components/TechLogo/logos/Nextjs.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Node.mjs +129 -0
- package/dist/esm/components/TechLogo/logos/Node.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Nuxt.mjs +33 -0
- package/dist/esm/components/TechLogo/logos/Nuxt.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Ollama.mjs +15 -0
- package/dist/esm/components/TechLogo/logos/Ollama.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/OpenAI.mjs +18 -0
- package/dist/esm/components/TechLogo/logos/OpenAI.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Perplexity.mjs +18 -0
- package/dist/esm/components/TechLogo/logos/Perplexity.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Preact.mjs +49 -0
- package/dist/esm/components/TechLogo/logos/Preact.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Reactjs.mjs +23 -0
- package/dist/esm/components/TechLogo/logos/Reactjs.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Solid.mjs +136 -0
- package/dist/esm/components/TechLogo/logos/Solid.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Svelte.mjs +23 -0
- package/dist/esm/components/TechLogo/logos/Svelte.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Tanstack.mjs +21 -0
- package/dist/esm/components/TechLogo/logos/Tanstack.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Vanilla.mjs +20 -0
- package/dist/esm/components/TechLogo/logos/Vanilla.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Vitejs.mjs +56 -0
- package/dist/esm/components/TechLogo/logos/Vitejs.mjs.map +1 -0
- package/dist/esm/components/TechLogo/logos/Vuejs.mjs +31 -0
- package/dist/esm/components/TechLogo/logos/Vuejs.mjs.map +1 -0
- package/dist/esm/components/TechLogo/techLogos.mjs +71 -0
- package/dist/esm/components/TechLogo/techLogos.mjs.map +1 -0
- package/dist/esm/components/TechLogo/types.mjs +39 -0
- package/dist/esm/components/TechLogo/types.mjs.map +1 -0
- package/dist/esm/components/index.mjs +4 -1
- package/dist/esm/hooks/index.mjs +9 -9
- package/dist/esm/hooks/useAuth/useOAuth2.mjs +1 -1
- package/dist/esm/hooks/useAuth/useSession.mjs +1 -1
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts +2 -2
- package/dist/types/components/Command/index.d.ts +2 -2
- package/dist/types/components/IDE/CopyCode.d.ts +2 -1
- package/dist/types/components/IDE/CopyCode.d.ts.map +1 -1
- package/dist/types/components/Link/Link.d.ts +2 -2
- package/dist/types/components/Table/ExpandButton.d.ts +10 -0
- package/dist/types/components/Table/ExpandButton.d.ts.map +1 -0
- package/dist/types/components/Table/Table.d.ts.map +1 -1
- package/dist/types/components/Table/table.content.d.ts +42 -20
- package/dist/types/components/Table/table.content.d.ts.map +1 -1
- package/dist/types/components/Table/useTableWidths.d.ts +7 -0
- package/dist/types/components/Table/useTableWidths.d.ts.map +1 -0
- package/dist/types/components/Tag/index.d.ts +1 -1
- package/dist/types/components/TechLogo/TechLogo.d.ts +11 -0
- package/dist/types/components/TechLogo/TechLogo.d.ts.map +1 -0
- package/dist/types/components/TechLogo/index.d.ts +4 -0
- package/dist/types/components/TechLogo/logos/Adonis.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Adonis.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Angular.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Angular.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Anthropic.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Anthropic.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Astro.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Astro.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/ChatGPT.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/ChatGPT.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Claude.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Claude.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/DeepSeek.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/DeepSeek.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Express.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Express.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Fastify.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Fastify.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Gemini.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Gemini.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/GoogleAI.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/GoogleAI.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Grok.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Grok.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Hono.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Hono.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Lit.d.ts +8 -0
- package/dist/types/components/TechLogo/logos/Lit.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Lynx.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Lynx.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Mistral.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Mistral.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/NestJS.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/NestJS.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Nextjs.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Nextjs.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Node.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Node.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Nuxt.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Nuxt.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Ollama.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Ollama.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/OpenAI.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/OpenAI.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Perplexity.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Perplexity.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Preact.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Preact.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Reactjs.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Reactjs.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Solid.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Solid.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Svelte.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Svelte.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Tanstack.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Tanstack.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Vanilla.d.ts +8 -0
- package/dist/types/components/TechLogo/logos/Vanilla.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Vitejs.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Vitejs.d.ts.map +1 -0
- package/dist/types/components/TechLogo/logos/Vuejs.d.ts +7 -0
- package/dist/types/components/TechLogo/logos/Vuejs.d.ts.map +1 -0
- package/dist/types/components/TechLogo/techLogos.d.ts +39 -0
- package/dist/types/components/TechLogo/techLogos.d.ts.map +1 -0
- package/dist/types/components/TechLogo/types.d.ts +37 -0
- package/dist/types/components/TechLogo/types.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +4 -1
- package/package.json +14 -14
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { useUser } from "../../hooks/useUser/index.mjs";
|
|
3
4
|
import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
|
|
4
5
|
import { AutoCompleteTextarea } from "../TextArea/AutocompleteTextArea.mjs";
|
|
5
|
-
import { useUser } from "../../hooks/useUser/index.mjs";
|
|
6
6
|
import { useEffect, useState } from "react";
|
|
7
7
|
import { Check, X } from "lucide-react";
|
|
8
8
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { renameKey } from "../../../utils/object.mjs";
|
|
4
|
+
import { useAuditContentDeclarationField } from "../../../hooks/reactQuery.mjs";
|
|
4
5
|
import { Container } from "../../Container/index.mjs";
|
|
5
6
|
import { Button, ButtonColor, ButtonSize, ButtonTextAlign, ButtonVariant } from "../../Button/Button.mjs";
|
|
6
7
|
import { InputVariant } from "../../Input/Input.mjs";
|
|
7
8
|
import { SwitchSelector, SwitchSelectorColor, SwitchSelectorSize } from "../../SwitchSelector/index.mjs";
|
|
8
9
|
import { useLocaleSwitcherContent } from "../../LocaleSwitcherContentDropDown/LocaleSwitcherContentContext.mjs";
|
|
9
10
|
import { ContentEditorInput as ContentEditorInput$1 } from "../../ContentEditor/ContentEditorInput.mjs";
|
|
10
|
-
import { useAuditContentDeclarationField } from "../../../hooks/reactQuery.mjs";
|
|
11
11
|
import { ContentEditorTextArea as ContentEditorTextArea$1 } from "../../ContentEditor/ContentEditorTextArea.mjs";
|
|
12
12
|
import { Label } from "../../Label/index.mjs";
|
|
13
13
|
import { MarkdownRenderer as MarkdownRenderer$1 } from "../../MarkDownRender/MarkDownRender.mjs";
|
|
@@ -15,9 +15,9 @@ import { EnumKeyInput } from "../EnumKeyInput.mjs";
|
|
|
15
15
|
import { Fragment, useState } from "react";
|
|
16
16
|
import { Plus, Trash, WandSparkles } from "lucide-react";
|
|
17
17
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { useConfiguration, useEditedContent } from "@intlayer/editor-react";
|
|
18
19
|
import { useIntlayer, useLocale } from "react-intlayer";
|
|
19
20
|
import { getLocaleName } from "@intlayer/core/localization";
|
|
20
|
-
import { useConfiguration, useEditedContent } from "@intlayer/editor-react";
|
|
21
21
|
import { getEmptyNode, getNodeType } from "@intlayer/core/dictionaryManipulator";
|
|
22
22
|
import * as NodeTypes from "@intlayer/types/nodeType";
|
|
23
23
|
|
package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { ButtonColor } from "../../Button/Button.mjs";
|
|
4
3
|
import { useSession } from "../../../hooks/useAuth/useSession.mjs";
|
|
5
4
|
import { useAddDictionary, useGetProjects } from "../../../hooks/reactQuery.mjs";
|
|
5
|
+
import { ButtonColor } from "../../Button/Button.mjs";
|
|
6
6
|
import { MultiSelect } from "../../Select/Multiselect.mjs";
|
|
7
7
|
import { useForm } from "../../Form/FormBase.mjs";
|
|
8
8
|
import { Form } from "../../Form/Form.mjs";
|
package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { useSession } from "../../../hooks/useAuth/useSession.mjs";
|
|
4
|
+
import { useAuditContentDeclarationMetadata, useGetProjects, useGetTags } from "../../../hooks/reactQuery.mjs";
|
|
3
5
|
import { Loader } from "../../Loader/index.mjs";
|
|
4
6
|
import { ButtonColor, ButtonSize, ButtonVariant } from "../../Button/Button.mjs";
|
|
5
7
|
import { Checkbox } from "../../Input/Checkbox.mjs";
|
|
6
|
-
import { useSession } from "../../../hooks/useAuth/useSession.mjs";
|
|
7
|
-
import { useAuditContentDeclarationMetadata, useGetProjects, useGetTags } from "../../../hooks/reactQuery.mjs";
|
|
8
8
|
import { MultiSelect } from "../../Select/Multiselect.mjs";
|
|
9
9
|
import { Select } from "../../Select/Select.mjs";
|
|
10
10
|
import { useForm as useForm$1 } from "../../Form/FormBase.mjs";
|
|
@@ -13,8 +13,8 @@ import { useDictionaryDetailsSchema } from "./useDictionaryDetailsSchema.mjs";
|
|
|
13
13
|
import { useEffect } from "react";
|
|
14
14
|
import { WandSparkles } from "lucide-react";
|
|
15
15
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
-
import { useIntlayer } from "react-intlayer";
|
|
17
16
|
import { useEditedContent } from "@intlayer/editor-react";
|
|
17
|
+
import { useIntlayer } from "react-intlayer";
|
|
18
18
|
import { AnimatePresence, motion } from "framer-motion";
|
|
19
19
|
import { useWatch } from "react-hook-form";
|
|
20
20
|
|
|
@@ -12,8 +12,8 @@ import { StructureEditor } from "./StructureEditor.mjs";
|
|
|
12
12
|
import { useEffect } from "react";
|
|
13
13
|
import { ArrowLeft } from "lucide-react";
|
|
14
14
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
-
import { useIntlayer } from "react-intlayer";
|
|
16
15
|
import { useConfiguration, useDictionariesRecordActions, useFocusUnmergedDictionary } from "@intlayer/editor-react";
|
|
16
|
+
import { useIntlayer } from "react-intlayer";
|
|
17
17
|
|
|
18
18
|
//#region src/components/DictionaryFieldEditor/DictionaryFieldEditor.tsx
|
|
19
19
|
const DictionaryFieldEditor = ({ dictionary, onClickDictionaryList, isDarkMode, mode, onDelete, onSave, showReturnButton = true }) => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Button, ButtonColor, ButtonTextAlign, ButtonVariant } from "../../Button/Button.mjs";
|
|
2
2
|
import { Accordion } from "../../Accordion/Accordion.mjs";
|
|
3
3
|
import { getIsEditableSection } from "../getIsEditableSection.mjs";
|
|
4
|
-
import configuration from "@intlayer/config/built";
|
|
5
4
|
import { ChevronRight, Plus } from "lucide-react";
|
|
6
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
import
|
|
6
|
+
import configuration from "@intlayer/config/built";
|
|
8
7
|
import { useEditedContentActions, useEditorLocale, useFocusUnmergedDictionary } from "@intlayer/editor-react";
|
|
8
|
+
import { useIntlayer } from "react-intlayer";
|
|
9
9
|
import { getContentNodeByKeyPath, getEmptyNode, getNodeType } from "@intlayer/core/dictionaryManipulator";
|
|
10
10
|
import * as NodeTypes from "@intlayer/types/nodeType";
|
|
11
11
|
import { isSameKeyPath } from "@intlayer/core/utils";
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../../utils/cn.mjs";
|
|
4
|
-
import { ButtonColor, ButtonVariant } from "../../Button/Button.mjs";
|
|
5
4
|
import { useAuth } from "../../../hooks/useAuth/useAuth.mjs";
|
|
6
5
|
import { useDeleteDictionary, usePushDictionaries, useWriteDictionary } from "../../../hooks/reactQuery.mjs";
|
|
6
|
+
import { ButtonColor, ButtonVariant } from "../../Button/Button.mjs";
|
|
7
7
|
import { Modal, ModalSize } from "../../Modal/Modal.mjs";
|
|
8
8
|
import { Form } from "../../Form/Form.mjs";
|
|
9
9
|
import { useState } from "react";
|
|
10
10
|
import { ArrowUpFromLine, Download, RotateCcw, Save, Trash } from "lucide-react";
|
|
11
11
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
-
import { useIntlayer } from "react-intlayer";
|
|
13
12
|
import { useDictionariesRecordActions, useEditedContent } from "@intlayer/editor-react";
|
|
13
|
+
import { useIntlayer } from "react-intlayer";
|
|
14
14
|
|
|
15
15
|
//#region src/components/DictionaryFieldEditor/SaveForm/SaveForm.tsx
|
|
16
16
|
const SaveForm = ({ dictionary, mode, className, onDelete, onSave, ...props }) => {
|
|
@@ -7,8 +7,8 @@ import { EditableFieldInput } from "../../EditableField/EditableFieldInput.mjs";
|
|
|
7
7
|
import { NodeTypeSelector } from "../NodeTypeSelector.mjs";
|
|
8
8
|
import { Plus, Trash } from "lucide-react";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
-
import { useIntlayer } from "react-intlayer";
|
|
11
10
|
import { useConfiguration, useEditedContentActions, useFocusUnmergedDictionary } from "@intlayer/editor-react";
|
|
11
|
+
import { useIntlayer } from "react-intlayer";
|
|
12
12
|
import { getDefaultNode, getNodeChildren, getNodeType } from "@intlayer/core/dictionaryManipulator";
|
|
13
13
|
import * as NodeTypes from "@intlayer/types/nodeType";
|
|
14
14
|
import { isSameKeyPath } from "@intlayer/core/utils";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { InputIndicator, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "../../Input/OTPInput.mjs";
|
|
4
3
|
import { useItemSelector } from "../../../hooks/useItemSelector.mjs";
|
|
4
|
+
import { InputIndicator, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "../../Input/OTPInput.mjs";
|
|
5
5
|
import { useFormField } from "../FormField.mjs";
|
|
6
6
|
import { FormItemLayout } from "../layout/FormItemLayout.mjs";
|
|
7
7
|
import { Form } from "../Form.mjs";
|
|
@@ -7,11 +7,14 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
7
7
|
import { useIntlayer } from "react-intlayer";
|
|
8
8
|
|
|
9
9
|
//#region src/components/IDE/CopyCode.tsx
|
|
10
|
-
const CopyCode = ({ code }) => {
|
|
10
|
+
const CopyCode = ({ code, ...props }) => {
|
|
11
11
|
const { title, description } = useIntlayer("code");
|
|
12
12
|
return /* @__PURE__ */ jsxs(Popover, {
|
|
13
13
|
identifier: "copy",
|
|
14
|
-
children: [/* @__PURE__ */ jsx(CopyButton, {
|
|
14
|
+
children: [/* @__PURE__ */ jsx(CopyButton, {
|
|
15
|
+
content: code,
|
|
16
|
+
...props
|
|
17
|
+
}), /* @__PURE__ */ jsxs(Popover.Detail, {
|
|
15
18
|
identifier: "copy",
|
|
16
19
|
className: "flex min-w-64 flex-col gap-3 p-3 text-sm",
|
|
17
20
|
xAlign: PopoverXAlign.END,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyCode.mjs","names":[],"sources":["../../../../src/components/IDE/CopyCode.tsx"],"sourcesContent":["'use client';\n\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { CopyButton } from '../CopyButton';\nimport { Popover, PopoverXAlign } from '../Popover';\n\ntype CopyCodeProps = {\n code: string;\n}
|
|
1
|
+
{"version":3,"file":"CopyCode.mjs","names":[],"sources":["../../../../src/components/IDE/CopyCode.tsx"],"sourcesContent":["'use client';\n\nimport type { ButtonProps } from '@components/Button';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { CopyButton } from '../CopyButton';\nimport { Popover, PopoverXAlign } from '../Popover';\n\ntype CopyCodeProps = {\n code: string;\n} & Partial<Omit<ButtonProps, 'children'>>;\n\nexport const CopyCode: FC<CopyCodeProps> = ({ code, ...props }) => {\n const { title, description } = useIntlayer('code');\n\n return (\n <Popover identifier=\"copy\">\n <CopyButton content={code} {...props} />\n\n <Popover.Detail\n identifier=\"copy\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign={PopoverXAlign.END}\n >\n <strong>{title}</strong>\n <p className=\"text-neutral\">{description}</p>\n </Popover.Detail>\n </Popover>\n );\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,YAA+B,EAAE,MAAM,GAAG,YAAY;CACjE,MAAM,EAAE,OAAO,gBAAgB,YAAY,OAAO;AAElD,QACE,qBAAC,SAAD;EAAS,YAAW;YAApB,CACE,oBAAC,YAAD;GAAY,SAAS;GAAM,GAAI;GAAS,GAExC,qBAAC,QAAQ,QAAT;GACE,YAAW;GACX,WAAU;GACV,QAAQ,cAAc;aAHxB,CAKE,oBAAC,UAAD,YAAS,OAAe,GACxB,oBAAC,KAAD;IAAG,WAAU;cAAgB;IAAgB,EAC9B;KACT"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { usePersistedStore } from "../../hooks/usePersistedStore.mjs";
|
|
3
4
|
import { Container } from "../Container/index.mjs";
|
|
4
5
|
import { Button, ButtonColor, ButtonSize, ButtonTextAlign, ButtonVariant } from "../Button/Button.mjs";
|
|
5
6
|
import { Input } from "../Input/Input.mjs";
|
|
6
7
|
import { SwitchSelector, SwitchSelectorColor, SwitchSelectorSize } from "../SwitchSelector/index.mjs";
|
|
7
|
-
import { usePersistedStore } from "../../hooks/usePersistedStore.mjs";
|
|
8
8
|
import { DropDown } from "../DropDown/index.mjs";
|
|
9
9
|
import { useLocaleSwitcherContent } from "./LocaleSwitcherContentContext.mjs";
|
|
10
10
|
import { useMemo, useRef, useState } from "react";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
+
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
5
|
+
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
4
6
|
import { Container } from "../Container/index.mjs";
|
|
5
7
|
import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
|
|
6
8
|
import { H3 } from "../Headers/index.mjs";
|
|
7
|
-
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
8
|
-
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
9
9
|
import { useEffect } from "react";
|
|
10
10
|
import { cva } from "class-variance-authority";
|
|
11
11
|
import { X } from "lucide-react";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
-
import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
|
|
5
4
|
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
6
5
|
import { useScrollDetection } from "../../hooks/useScrollDetection.mjs";
|
|
6
|
+
import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
|
|
7
7
|
import { Burger } from "./Burger.mjs";
|
|
8
8
|
import { useRef, useState } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
-
import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
|
|
5
4
|
import { useItemSelector } from "../../hooks/useItemSelector.mjs";
|
|
5
|
+
import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
|
|
6
6
|
import { useEffect, useRef } from "react";
|
|
7
7
|
import { cva } from "class-variance-authority";
|
|
8
8
|
import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
4
|
+
import { useDevice } from "../../hooks/useDevice.mjs";
|
|
5
|
+
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
3
6
|
import { Container } from "../Container/index.mjs";
|
|
4
7
|
import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
|
|
5
|
-
import { useDevice } from "../../hooks/useDevice.mjs";
|
|
6
8
|
import { KeyboardShortcut } from "../KeyboardShortcut/KeyboardShortcut.mjs";
|
|
7
9
|
import { Popover } from "../Popover/dynamic.mjs";
|
|
8
|
-
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
9
|
-
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
10
10
|
import { MaxWidthSmoother } from "../MaxWidthSmoother/index.mjs";
|
|
11
11
|
import { isElementAtTopAndNotCovered } from "./isElementAtTopAndNotCovered.mjs";
|
|
12
12
|
import { useRightDrawer } from "./useRightDrawer.mjs";
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Button } from "../Button/Button.mjs";
|
|
2
|
+
import { PopoverXAlign } from "../Popover/static.mjs";
|
|
3
|
+
import { Popover } from "../Popover/dynamic.mjs";
|
|
4
|
+
import { MoveDiagonal } from "lucide-react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useIntlayer } from "react-intlayer";
|
|
7
|
+
|
|
8
|
+
//#region src/components/Table/ExpandButton.tsx
|
|
9
|
+
const ExpandButton = ({ setIsModalOpen }) => {
|
|
10
|
+
const { modal: modalContent } = useIntlayer("table");
|
|
11
|
+
return /* @__PURE__ */ jsx("div", {
|
|
12
|
+
className: "pointer-events-none absolute inset-y-0 right-4 z-10",
|
|
13
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
14
|
+
className: "pointer-events-auto sticky top-48 pt-4",
|
|
15
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
16
|
+
identifier: "expand",
|
|
17
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
18
|
+
variant: "hoverable",
|
|
19
|
+
size: "icon-md",
|
|
20
|
+
onClick: () => {
|
|
21
|
+
setIsModalOpen(true);
|
|
22
|
+
},
|
|
23
|
+
label: modalContent.title,
|
|
24
|
+
Icon: MoveDiagonal
|
|
25
|
+
}), /* @__PURE__ */ jsxs(Popover.Detail, {
|
|
26
|
+
identifier: "expand",
|
|
27
|
+
className: "flex min-w-64 flex-col gap-3 p-3 text-sm",
|
|
28
|
+
xAlign: PopoverXAlign.END,
|
|
29
|
+
children: [/* @__PURE__ */ jsx("strong", { children: modalContent.title }), /* @__PURE__ */ jsx("p", {
|
|
30
|
+
className: "text-neutral",
|
|
31
|
+
children: modalContent.description
|
|
32
|
+
})]
|
|
33
|
+
})]
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//#endregion
|
|
40
|
+
export { ExpandButton };
|
|
41
|
+
//# sourceMappingURL=ExpandButton.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandButton.mjs","names":[],"sources":["../../../../src/components/Table/ExpandButton.tsx"],"sourcesContent":["import { Popover, PopoverXAlign } from '@components/Popover';\nimport { MoveDiagonal } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Button } from '../Button';\n\ntype ExpandButtonProps = {\n setIsModalOpen: (isOpen: boolean) => void;\n};\n\nexport const ExpandButton: FC<ExpandButtonProps> = ({ setIsModalOpen }) => {\n const { modal: modalContent } = useIntlayer('table');\n\n return (\n <div className=\"pointer-events-none absolute inset-y-0 right-4 z-10\">\n <div className=\"pointer-events-auto sticky top-48 pt-4\">\n <Popover identifier=\"expand\">\n <Button\n variant=\"hoverable\"\n size=\"icon-md\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n label={modalContent.title}\n Icon={MoveDiagonal}\n />\n\n <Popover.Detail\n identifier=\"expand\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign={PopoverXAlign.END}\n >\n <strong>{modalContent.title}</strong>\n <p className=\"text-neutral\">{modalContent.description}</p>\n </Popover.Detail>\n </Popover>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAUA,MAAa,gBAAuC,EAAE,qBAAqB;CACzE,MAAM,EAAE,OAAO,iBAAiB,YAAY,QAAQ;AAEpD,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,SAAD;IAAS,YAAW;cAApB,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;AACb,qBAAe,KAAK;;KAEtB,OAAO,aAAa;KACpB,MAAM;KACN,GAEF,qBAAC,QAAQ,QAAT;KACE,YAAW;KACX,WAAU;KACV,QAAQ,cAAc;eAHxB,CAKE,oBAAC,UAAD,YAAS,aAAa,OAAe,GACrC,oBAAC,KAAD;MAAG,WAAU;gBAAgB,aAAa;MAAgB,EAC3C;OACT;;GACN;EACF"}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
-
import { Button } from "../Button/Button.mjs";
|
|
5
4
|
import { ExpandCollapse } from "../ExpandCollapse/ExpandCollapse.mjs";
|
|
6
5
|
import { Modal, ModalSize } from "../Modal/Modal.mjs";
|
|
6
|
+
import { ExpandButton } from "./ExpandButton.mjs";
|
|
7
|
+
import { useTableWidths } from "./useTableWidths.mjs";
|
|
7
8
|
import { useEffect, useRef, useState } from "react";
|
|
8
|
-
import { MoveDiagonal } from "lucide-react";
|
|
9
9
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
|
|
11
11
|
//#region src/components/Table/Table.tsx
|
|
12
|
-
const CHAR_WIDTH_REM = .55;
|
|
13
|
-
const MIN_WIDTH_REM = 5;
|
|
14
|
-
const MAX_WIDTH_REM = 30;
|
|
15
12
|
/**
|
|
16
13
|
* Table component that provides an enhanced table experience with modal expansion and collapsible content
|
|
17
14
|
*
|
|
@@ -149,63 +146,52 @@ const MAX_WIDTH_REM = 30;
|
|
|
149
146
|
* @see {@link Modal} - Component used for full-screen table view
|
|
150
147
|
* @see {@link Button} - Component used for the modal trigger button
|
|
151
148
|
*/
|
|
152
|
-
const Table = ({ className, isRollable = false, displayModal, ...props }) => {
|
|
149
|
+
const Table = ({ className, isRollable = false, displayModal, onClick, ...props }) => {
|
|
153
150
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
151
|
+
const [highlightedRowIndex, setHighlightedRowIndex] = useState(null);
|
|
154
152
|
const tableRef = useRef(null);
|
|
155
153
|
const modalTableRef = useRef(null);
|
|
154
|
+
useTableWidths(tableRef, modalTableRef, [props.children, isModalOpen]);
|
|
156
155
|
useEffect(() => {
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
const applyToTable = (table) => {
|
|
166
|
-
const rows = Array.from(table.querySelectorAll("tr"));
|
|
167
|
-
if (rows.length === 0) return;
|
|
168
|
-
const applyColStyle = (el, index) => {
|
|
169
|
-
const minRem = Math.min(MAX_WIDTH_REM, Math.max(MIN_WIDTH_REM, (colLengths[index] ?? 0) * CHAR_WIDTH_REM));
|
|
170
|
-
el.style.minWidth = `${minRem}rem`;
|
|
171
|
-
el.style.maxWidth = `${MAX_WIDTH_REM}rem`;
|
|
172
|
-
};
|
|
173
|
-
table.querySelectorAll("th").forEach((th, index) => {
|
|
174
|
-
applyColStyle(th, index);
|
|
175
|
-
});
|
|
176
|
-
rows.forEach((row) => {
|
|
177
|
-
row.querySelectorAll("td").forEach((td, index) => {
|
|
178
|
-
applyColStyle(td, index);
|
|
156
|
+
if (isModalOpen && highlightedRowIndex !== null && modalTableRef.current) {
|
|
157
|
+
const row = modalTableRef.current.rows[highlightedRowIndex];
|
|
158
|
+
if (row) {
|
|
159
|
+
row.scrollIntoView({
|
|
160
|
+
behavior: "smooth",
|
|
161
|
+
block: "center"
|
|
179
162
|
});
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}, [
|
|
163
|
+
row.classList.add("bg-neutral/40", "dark:bg-neutral-dark/40");
|
|
164
|
+
row.style.transition = "background-color 0.3s ease-in-out";
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}, [isModalOpen, highlightedRowIndex]);
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
if (!isModalOpen) setHighlightedRowIndex(null);
|
|
170
|
+
}, [isModalOpen]);
|
|
171
|
+
const handleTableClick = (e) => {
|
|
172
|
+
if (displayModal) {
|
|
173
|
+
const tr = e.target.closest("tr");
|
|
174
|
+
if (tr?.closest("tbody")) {
|
|
175
|
+
setHighlightedRowIndex(tr.rowIndex);
|
|
176
|
+
setIsModalOpen(true);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
onClick?.(e);
|
|
180
|
+
};
|
|
185
181
|
return /* @__PURE__ */ jsxs("div", {
|
|
186
|
-
className: "relative
|
|
182
|
+
className: "group relative",
|
|
187
183
|
children: [
|
|
188
|
-
displayModal && /* @__PURE__ */ jsx(
|
|
189
|
-
className: "sticky top-48 z-10",
|
|
190
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
191
|
-
className: "absolute top-4 right-2",
|
|
192
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
193
|
-
variant: "hoverable",
|
|
194
|
-
size: "icon-md",
|
|
195
|
-
onClick: () => {
|
|
196
|
-
setIsModalOpen(true);
|
|
197
|
-
},
|
|
198
|
-
label: "Move",
|
|
199
|
-
Icon: MoveDiagonal
|
|
200
|
-
})
|
|
201
|
-
})
|
|
202
|
-
}),
|
|
184
|
+
displayModal && /* @__PURE__ */ jsx(ExpandButton, { setIsModalOpen }),
|
|
203
185
|
/* @__PURE__ */ jsx(ExpandCollapse, {
|
|
204
186
|
isRollable,
|
|
205
|
-
className: "max-w-full overflow-x-auto",
|
|
187
|
+
className: "max-w-full overflow-x-auto rounded-2xl bg-background text-left [corner-shape:squircle] supports-[corner-shape:squircle]:rounded-3xl",
|
|
206
188
|
children: /* @__PURE__ */ jsx("table", {
|
|
207
189
|
ref: tableRef,
|
|
208
|
-
className: cn("w-full table-auto
|
|
190
|
+
className: cn("w-full table-auto overflow-hidden", displayModal && "[&_tbody_tr:hover]:bg-neutral/40 [&_tbody_tr:hover]:dark:bg-neutral-dark/40 [&_tbody_tr]:cursor-pointer [&_tbody_tr]:transition-colors", className),
|
|
191
|
+
onClick: handleTableClick,
|
|
192
|
+
onKeyDown: (e) => {
|
|
193
|
+
if (e.key === "Enter" || e.key === " ") handleTableClick(e);
|
|
194
|
+
},
|
|
209
195
|
...props
|
|
210
196
|
})
|
|
211
197
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.mjs","names":[],"sources":["../../../../src/components/Table/Table.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { MoveDiagonal } from 'lucide-react';\nimport {\n type FC,\n type HTMLAttributes,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Button } from '../Button';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { Modal, ModalSize } from '../Modal';\n\n/**\n * Properties for the Table component that extends standard HTML table attributes\n *\n * @interface TableProps\n * @extends {HTMLAttributes<HTMLTableElement>}\n *\n * @property {boolean} [isRollable] - Whether the table content can be collapsed/expanded using the ExpandCollapse wrapper\n * @property {string} [className] - Additional CSS classes for custom styling\n * @property {ReactNode} children - The table content including thead, tbody, tfoot elements\n *\n * @example\n * ```tsx\n * // Basic table usage\n * <Table>\n * <thead>\n * <tr>\n * <th>Name</th>\n * <th>Email</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * </tr>\n * </tbody>\n * </Table>\n *\n * // Collapsible table with custom styling\n * <Table isRollable className=\"border border-gray-300 rounded-lg\">\n * <thead>\n * <tr>\n * <th>Product</th>\n * <th>Price</th>\n * <th>Stock</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>Laptop</td>\n * <td>$999</td>\n * <td>15</td>\n * </tr>\n * </tbody>\n * </Table>\n * ```\n */\ntype TableProps = HTMLAttributes<HTMLTableElement> & {\n isRollable?: boolean;\n displayModal?: boolean;\n};\n\n// ~0.55rem per character (mid-point for proportional fonts)\nconst CHAR_WIDTH_REM = 0.55;\nconst MIN_WIDTH_REM = 5; // ~80px at 16px base\nconst MAX_WIDTH_REM = 30; // ~480px at 16px base\n\n/**\n * Table component that provides an enhanced table experience with modal expansion and collapsible content\n *\n * The Table component wraps a standard HTML table element with additional functionality:\n * - **Modal Expansion**: Click the diagonal arrow button to view the table in a full-screen modal\n * - **Collapsible Content**: Optionally wrap content in an ExpandCollapse component for space-saving\n * - **Responsive Design**: Handles large tables gracefully with modal overflow\n * - **Sticky Controls**: Table controls remain accessible even when scrolling\n *\n * ## Features\n * - **Modal View**: Full-screen modal for better viewing of large tables\n * - **Expand/Collapse**: Optional collapsible wrapper to save space\n * - **Responsive**: Handles overflow and responsive behavior automatically\n * - **Accessibility**: Maintains proper table semantics and keyboard navigation\n * - **Customizable**: Supports all standard HTML table attributes and styling\n *\n * ## Best Practices\n * - Use semantic HTML table structure (thead, tbody, tfoot)\n * - Provide proper column headers with scope attributes\n * - Use the isRollable prop for large tables that might need space management\n * - Apply consistent styling through the className prop\n * - Consider pagination for very large datasets\n *\n * @param {TableProps} props - The properties for the Table component\n * @returns {JSX.Element} The rendered table with enhanced functionality\n *\n * @example\n * ```tsx\n * // Simple data table\n * <Table>\n * <thead>\n * <tr>\n * <th scope=\"col\">Name</th>\n * <th scope=\"col\">Email</th>\n * <th scope=\"col\">Status</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs\">\n * Active\n * </span>\n * </td>\n * </tr>\n * <tr>\n * <td>Jane Smith</td>\n * <td>jane@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full text-xs\">\n * Pending\n * </span>\n * </td>\n * </tr>\n * </tbody>\n * </Table>\n *\n * // Large collapsible table with custom styling\n * <Table\n * isRollable\n * className=\"border border-gray-200 rounded-lg overflow-hidden\"\n * >\n * <thead className=\"bg-gray-50\">\n * <tr>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Product ID\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Name\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Category\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Price\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Stock\n * </th>\n * </tr>\n * </thead>\n * <tbody className=\"bg-white divide-y divide-gray-200\">\n * {products.map((product) => (\n * <tr key={product.id} className=\"hover:bg-gray-50\">\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * #{product.id}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\">\n * {product.name}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.category}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * ${product.price.toFixed(2)}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.stock} units\n * </td>\n * </tr>\n * ))}\n * </tbody>\n * </Table>\n *\n * // Financial data table with formatted numbers\n * <Table className=\"w-full border-collapse\">\n * <thead>\n * <tr className=\"border-b-2 border-gray-300\">\n * <th scope=\"col\" className=\"text-left py-3 px-4\">Quarter</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Revenue</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Profit</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Growth</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q1 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,450,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$345,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+12.5%</td>\n * </tr>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q2 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,780,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$398,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+13.5%</td>\n * </tr>\n * </tbody>\n * </Table>\n * ```\n *\n * @see {@link ExpandCollapse} - Component used for collapsible table content\n * @see {@link Modal} - Component used for full-screen table view\n * @see {@link Button} - Component used for the modal trigger button\n */\nexport const Table: FC<TableProps> = ({\n className,\n isRollable = false,\n displayModal,\n ...props\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const tableRef = useRef<HTMLTableElement>(null);\n const modalTableRef = useRef<HTMLTableElement>(null);\n\n useEffect(() => {\n if (!tableRef.current) return;\n\n // Calculate the maximum character length per column from the main table\n const colLengths: number[] = [];\n Array.from(tableRef.current.querySelectorAll('tr')).forEach((row) => {\n Array.from(row.children).forEach((cell, index) => {\n const len = cell.textContent?.trim().length ?? 0;\n if (colLengths[index] === undefined || len > colLengths[index]) {\n colLengths[index] = len;\n }\n });\n });\n\n const applyToTable = (table: HTMLTableElement) => {\n const rows = Array.from(table.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const applyColStyle = (el: HTMLElement, index: number) => {\n const minRem = Math.min(\n MAX_WIDTH_REM,\n Math.max(MIN_WIDTH_REM, (colLengths[index] ?? 0) * CHAR_WIDTH_REM)\n );\n el.style.minWidth = `${minRem}rem`;\n el.style.maxWidth = `${MAX_WIDTH_REM}rem`;\n };\n\n table.querySelectorAll('th').forEach((th, index) => {\n applyColStyle(th, index);\n });\n rows.forEach((row) => {\n row.querySelectorAll('td').forEach((td, index) => {\n applyColStyle(td, index);\n });\n });\n };\n\n applyToTable(tableRef.current);\n\n if (modalTableRef.current) applyToTable(modalTableRef.current);\n }, [props.children, isModalOpen]);\n\n return (\n <div className=\"relative overflow-hidden rounded-2xl bg-background pr-4 [corner-shape:squircle] supports-[corner-shape:squircle]:rounded-3xl\">\n {displayModal && (\n <div className=\"sticky top-48 z-10\">\n <div className=\"absolute top-4 right-2\">\n <Button\n variant=\"hoverable\"\n size=\"icon-md\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n label=\"Move\"\n Icon={MoveDiagonal}\n />\n </div>\n </div>\n )}\n <ExpandCollapse\n isRollable={isRollable}\n className=\"max-w-full overflow-x-auto\"\n >\n <table\n ref={tableRef}\n className={cn('w-full table-auto text-left', className)}\n {...props}\n />\n </ExpandCollapse>\n\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n size={ModalSize.XL}\n hasCloseButton\n isScrollable\n >\n {isModalOpen ? (\n <div className=\"grid\">\n <table\n ref={modalTableRef}\n className={cn(\n 'min-w-full max-w-full table-auto text-left',\n className\n )}\n {...props}\n />\n </div>\n ) : (\n <></>\n )}\n </Modal>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;AAoEA,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2ItB,MAAa,SAAyB,EACpC,WACA,aAAa,OACb,cACA,GAAG,YACC;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CAErD,MAAM,WAAW,OAAyB,KAAK;CAC/C,MAAM,gBAAgB,OAAyB,KAAK;AAEpD,iBAAgB;AACd,MAAI,CAAC,SAAS,QAAS;EAGvB,MAAM,aAAuB,EAAE;AAC/B,QAAM,KAAK,SAAS,QAAQ,iBAAiB,KAAK,CAAC,CAAC,SAAS,QAAQ;AACnE,SAAM,KAAK,IAAI,SAAS,CAAC,SAAS,MAAM,UAAU;IAChD,MAAM,MAAM,KAAK,aAAa,MAAM,CAAC,UAAU;AAC/C,QAAI,WAAW,WAAW,UAAa,MAAM,WAAW,OACtD,YAAW,SAAS;KAEtB;IACF;EAEF,MAAM,gBAAgB,UAA4B;GAChD,MAAM,OAAO,MAAM,KAAK,MAAM,iBAAiB,KAAK,CAAC;AACrD,OAAI,KAAK,WAAW,EAAG;GAEvB,MAAM,iBAAiB,IAAiB,UAAkB;IACxD,MAAM,SAAS,KAAK,IAClB,eACA,KAAK,IAAI,gBAAgB,WAAW,UAAU,KAAK,eAAe,CACnE;AACD,OAAG,MAAM,WAAW,GAAG,OAAO;AAC9B,OAAG,MAAM,WAAW,GAAG,cAAc;;AAGvC,SAAM,iBAAiB,KAAK,CAAC,SAAS,IAAI,UAAU;AAClD,kBAAc,IAAI,MAAM;KACxB;AACF,QAAK,SAAS,QAAQ;AACpB,QAAI,iBAAiB,KAAK,CAAC,SAAS,IAAI,UAAU;AAChD,mBAAc,IAAI,MAAM;MACxB;KACF;;AAGJ,eAAa,SAAS,QAAQ;AAE9B,MAAI,cAAc,QAAS,cAAa,cAAc,QAAQ;IAC7D,CAAC,MAAM,UAAU,YAAY,CAAC;AAEjC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,gBACC,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,eAAe;AACb,sBAAe,KAAK;;MAEtB,OAAM;MACN,MAAM;MACN;KACE;IACF;GAER,oBAAC,gBAAD;IACc;IACZ,WAAU;cAEV,oBAAC,SAAD;KACE,KAAK;KACL,WAAW,GAAG,+BAA+B,UAAU;KACvD,GAAI;KACJ;IACa;GAEjB,oBAAC,OAAD;IACE,QAAQ;IACR,eAAe,eAAe,MAAM;IACpC,MAAM,UAAU;IAChB;IACA;cAEC,cACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,SAAD;MACE,KAAK;MACL,WAAW,GACT,8CACA,UACD;MACD,GAAI;MACJ;KACE,IAEN,kCAAK;IAED;GACJ"}
|
|
1
|
+
{"version":3,"file":"Table.mjs","names":[],"sources":["../../../../src/components/Table/Table.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\n\nimport {\n type FC,\n type HTMLAttributes,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { Modal, ModalSize } from '../Modal';\nimport { ExpandButton } from './ExpandButton';\nimport { useTableWidths } from './useTableWidths';\n\n/**\n * Properties for the Table component that extends standard HTML table attributes\n *\n * @interface TableProps\n * @extends {HTMLAttributes<HTMLTableElement>}\n *\n * @property {boolean} [isRollable] - Whether the table content can be collapsed/expanded using the ExpandCollapse wrapper\n * @property {string} [className] - Additional CSS classes for custom styling\n * @property {ReactNode} children - The table content including thead, tbody, tfoot elements\n *\n * @example\n * ```tsx\n * // Basic table usage\n * <Table>\n * <thead>\n * <tr>\n * <th>Name</th>\n * <th>Email</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * </tr>\n * </tbody>\n * </Table>\n *\n * // Collapsible table with custom styling\n * <Table isRollable className=\"border border-gray-300 rounded-lg\">\n * <thead>\n * <tr>\n * <th>Product</th>\n * <th>Price</th>\n * <th>Stock</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>Laptop</td>\n * <td>$999</td>\n * <td>15</td>\n * </tr>\n * </tbody>\n * </Table>\n * ```\n */\ntype TableProps = HTMLAttributes<HTMLTableElement> & {\n isRollable?: boolean;\n displayModal?: boolean;\n};\n\n/**\n * Table component that provides an enhanced table experience with modal expansion and collapsible content\n *\n * The Table component wraps a standard HTML table element with additional functionality:\n * - **Modal Expansion**: Click the diagonal arrow button to view the table in a full-screen modal\n * - **Collapsible Content**: Optionally wrap content in an ExpandCollapse component for space-saving\n * - **Responsive Design**: Handles large tables gracefully with modal overflow\n * - **Sticky Controls**: Table controls remain accessible even when scrolling\n *\n * ## Features\n * - **Modal View**: Full-screen modal for better viewing of large tables\n * - **Expand/Collapse**: Optional collapsible wrapper to save space\n * - **Responsive**: Handles overflow and responsive behavior automatically\n * - **Accessibility**: Maintains proper table semantics and keyboard navigation\n * - **Customizable**: Supports all standard HTML table attributes and styling\n *\n * ## Best Practices\n * - Use semantic HTML table structure (thead, tbody, tfoot)\n * - Provide proper column headers with scope attributes\n * - Use the isRollable prop for large tables that might need space management\n * - Apply consistent styling through the className prop\n * - Consider pagination for very large datasets\n *\n * @param {TableProps} props - The properties for the Table component\n * @returns {JSX.Element} The rendered table with enhanced functionality\n *\n * @example\n * ```tsx\n * // Simple data table\n * <Table>\n * <thead>\n * <tr>\n * <th scope=\"col\">Name</th>\n * <th scope=\"col\">Email</th>\n * <th scope=\"col\">Status</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs\">\n * Active\n * </span>\n * </td>\n * </tr>\n * <tr>\n * <td>Jane Smith</td>\n * <td>jane@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full text-xs\">\n * Pending\n * </span>\n * </td>\n * </tr>\n * </tbody>\n * </Table>\n *\n * // Large collapsible table with custom styling\n * <Table\n * isRollable\n * className=\"border border-gray-200 rounded-lg overflow-hidden\"\n * >\n * <thead className=\"bg-gray-50\">\n * <tr>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Product ID\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Name\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Category\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Price\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Stock\n * </th>\n * </tr>\n * </thead>\n * <tbody className=\"bg-white divide-y divide-gray-200\">\n * {products.map((product) => (\n * <tr key={product.id} className=\"hover:bg-gray-50\">\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * #{product.id}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\">\n * {product.name}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.category}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * ${product.price.toFixed(2)}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.stock} units\n * </td>\n * </tr>\n * ))}\n * </tbody>\n * </Table>\n *\n * // Financial data table with formatted numbers\n * <Table className=\"w-full border-collapse\">\n * <thead>\n * <tr className=\"border-b-2 border-gray-300\">\n * <th scope=\"col\" className=\"text-left py-3 px-4\">Quarter</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Revenue</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Profit</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Growth</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q1 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,450,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$345,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+12.5%</td>\n * </tr>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q2 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,780,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$398,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+13.5%</td>\n * </tr>\n * </tbody>\n * </Table>\n * ```\n *\n * @see {@link ExpandCollapse} - Component used for collapsible table content\n * @see {@link Modal} - Component used for full-screen table view\n * @see {@link Button} - Component used for the modal trigger button\n */\nexport const Table: FC<TableProps> = ({\n className,\n isRollable = false,\n displayModal,\n onClick,\n ...props\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [highlightedRowIndex, setHighlightedRowIndex] = useState<number | null>(\n null\n );\n\n const tableRef = useRef<HTMLTableElement>(null);\n const modalTableRef = useRef<HTMLTableElement>(null);\n\n useTableWidths(tableRef, modalTableRef, [props.children, isModalOpen]);\n\n useEffect(() => {\n if (isModalOpen && highlightedRowIndex !== null && modalTableRef.current) {\n const row = modalTableRef.current.rows[highlightedRowIndex];\n\n if (row) {\n row.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n row.classList.add('bg-neutral/40', 'dark:bg-neutral-dark/40');\n row.style.transition = 'background-color 0.3s ease-in-out';\n }\n }\n }, [isModalOpen, highlightedRowIndex]);\n\n useEffect(() => {\n if (!isModalOpen) {\n setHighlightedRowIndex(null);\n }\n }, [isModalOpen]);\n\n const handleTableClick = (e: React.MouseEvent<HTMLTableElement>) => {\n if (displayModal) {\n const target = e.target as HTMLElement;\n const tr = target.closest('tr');\n\n if (tr?.closest('tbody')) {\n setHighlightedRowIndex(tr.rowIndex);\n setIsModalOpen(true);\n }\n }\n onClick?.(e);\n };\n\n return (\n <div className=\"group relative\">\n {displayModal && <ExpandButton setIsModalOpen={setIsModalOpen} />}\n\n <ExpandCollapse\n isRollable={isRollable}\n className=\"max-w-full overflow-x-auto rounded-2xl bg-background text-left [corner-shape:squircle] supports-[corner-shape:squircle]:rounded-3xl\"\n >\n <table\n ref={tableRef}\n className={cn(\n 'w-full table-auto overflow-hidden',\n displayModal &&\n '[&_tbody_tr:hover]:bg-neutral/40 [&_tbody_tr:hover]:dark:bg-neutral-dark/40 [&_tbody_tr]:cursor-pointer [&_tbody_tr]:transition-colors',\n className\n )}\n onClick={handleTableClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleTableClick(\n e as unknown as React.MouseEvent<HTMLTableElement>\n );\n }\n }}\n {...props}\n />\n </ExpandCollapse>\n\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n size={ModalSize.XL}\n hasCloseButton\n isScrollable\n >\n {isModalOpen ? (\n <div className=\"grid\">\n <table\n ref={modalTableRef}\n className={cn(\n 'min-w-full max-w-full table-auto text-left',\n className\n )}\n {...props}\n />\n </div>\n ) : (\n <></>\n )}\n </Modal>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6MA,MAAa,SAAyB,EACpC,WACA,aAAa,OACb,cACA,SACA,GAAG,YACC;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,CAAC,qBAAqB,0BAA0B,SACpD,KACD;CAED,MAAM,WAAW,OAAyB,KAAK;CAC/C,MAAM,gBAAgB,OAAyB,KAAK;AAEpD,gBAAe,UAAU,eAAe,CAAC,MAAM,UAAU,YAAY,CAAC;AAEtE,iBAAgB;AACd,MAAI,eAAe,wBAAwB,QAAQ,cAAc,SAAS;GACxE,MAAM,MAAM,cAAc,QAAQ,KAAK;AAEvC,OAAI,KAAK;AACP,QAAI,eAAe;KAAE,UAAU;KAAU,OAAO;KAAU,CAAC;AAE3D,QAAI,UAAU,IAAI,iBAAiB,0BAA0B;AAC7D,QAAI,MAAM,aAAa;;;IAG1B,CAAC,aAAa,oBAAoB,CAAC;AAEtC,iBAAgB;AACd,MAAI,CAAC,YACH,wBAAuB,KAAK;IAE7B,CAAC,YAAY,CAAC;CAEjB,MAAM,oBAAoB,MAA0C;AAClE,MAAI,cAAc;GAEhB,MAAM,KADS,EAAE,OACC,QAAQ,KAAK;AAE/B,OAAI,IAAI,QAAQ,QAAQ,EAAE;AACxB,2BAAuB,GAAG,SAAS;AACnC,mBAAe,KAAK;;;AAGxB,YAAU,EAAE;;AAGd,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,gBAAgB,oBAAC,cAAD,EAA8B,gBAAkB;GAEjE,oBAAC,gBAAD;IACc;IACZ,WAAU;cAEV,oBAAC,SAAD;KACE,KAAK;KACL,WAAW,GACT,qCACA,gBACE,0IACF,UACD;KACD,SAAS;KACT,YAAY,MAAM;AAChB,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,IACjC,kBACE,EACD;;KAGL,GAAI;KACJ;IACa;GAEjB,oBAAC,OAAD;IACE,QAAQ;IACR,eAAe,eAAe,MAAM;IACpC,MAAM,UAAU;IAChB;IACA;cAEC,cACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,SAAD;MACE,KAAK;MACL,WAAW,GACT,8CACA,UACD;MACD,GAAI;MACJ;KACE,IAEN,kCAAK;IAED;GACJ"}
|
|
@@ -3,26 +3,48 @@ import { t } from "intlayer";
|
|
|
3
3
|
//#region src/components/Table/table.content.ts
|
|
4
4
|
const tableContent = {
|
|
5
5
|
key: "table",
|
|
6
|
-
content: {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
6
|
+
content: { modal: {
|
|
7
|
+
title: t({
|
|
8
|
+
en: "Show all table content",
|
|
9
|
+
fr: "Afficher tout le contenu du tableau",
|
|
10
|
+
es: "Mostrar todo el contenido de la tabla",
|
|
11
|
+
"en-GB": "Show all table content",
|
|
12
|
+
de: "Alle Tabellendaten anzeigen",
|
|
13
|
+
ja: "テーブルのすべての内容を表示",
|
|
14
|
+
ko: "테이블의 모든 내용 표시",
|
|
15
|
+
zh: "显示表格的所有内容",
|
|
16
|
+
it: "Mostra tutto il contenuto della tabella",
|
|
17
|
+
pt: "Mostrar todo o conteúdo da tabela",
|
|
18
|
+
hi: "सभी तालिका सामग्री दिखाएं",
|
|
19
|
+
ar: "اظهار جميع محتويات الجدول",
|
|
20
|
+
ru: "Показать все данные таблицы",
|
|
21
|
+
tr: "Tüm tablo içeriğini göster",
|
|
22
|
+
pl: "Pokaż całą zawartość tabeli",
|
|
23
|
+
id: "Tampilkan semua isi tabel",
|
|
24
|
+
vi: "Hiển thị tất cả nội dung bảng",
|
|
25
|
+
uk: "Показати весь вміст таблиці"
|
|
26
|
+
}),
|
|
27
|
+
description: t({
|
|
28
|
+
en: "Open the table in a modal to view all data content clearly",
|
|
29
|
+
fr: "Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement",
|
|
30
|
+
es: "Abrir la tabla en una ventana flotante para ver todo el contenido claramente",
|
|
31
|
+
"en-GB": "Open the table in a modal to view all data content clearly",
|
|
32
|
+
de: "Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen",
|
|
33
|
+
ja: "テーブルをモーダルで開き、すべてのデータを明確に表示",
|
|
34
|
+
ko: "테이블을 모달로 열어 모든 데이터를 명확하게 확인",
|
|
35
|
+
zh: "在弹窗中打开表格以清晰地查看所有数据",
|
|
36
|
+
it: "Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro",
|
|
37
|
+
pt: "Abrir a tabela em um modal para ver todo o conteúdo claramente",
|
|
38
|
+
hi: "सभी डेटा सामग्री को स्पष्ट रूप से देखने के लिए तालिका को मोडल में खोलें",
|
|
39
|
+
ar: "افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح",
|
|
40
|
+
ru: "Открыть таблицу в модальном окне для четкого просмотра всех данных",
|
|
41
|
+
tr: "Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın",
|
|
42
|
+
pl: "Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość",
|
|
43
|
+
id: "Buka tabel dalam modal untuk melihat semua isi data dengan jelas",
|
|
44
|
+
vi: "Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng",
|
|
45
|
+
uk: "Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані"
|
|
46
|
+
})
|
|
47
|
+
} },
|
|
26
48
|
title: "Table component content",
|
|
27
49
|
description: "Content declaration related to the Table component, specifically for UI message to display all table content.",
|
|
28
50
|
tags: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.content.mjs","names":[],"sources":["../../../../src/components/Table/table.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nconst tableContent = {\n key: 'table',\n content: {\n
|
|
1
|
+
{"version":3,"file":"table.content.mjs","names":[],"sources":["../../../../src/components/Table/table.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nconst tableContent = {\n key: 'table',\n content: {\n modal: {\n title: t({\n en: 'Show all table content',\n fr: 'Afficher tout le contenu du tableau',\n es: 'Mostrar todo el contenido de la tabla',\n 'en-GB': 'Show all table content',\n de: 'Alle Tabellendaten anzeigen',\n ja: 'テーブルのすべての内容を表示',\n ko: '테이블의 모든 내용 표시',\n zh: '显示表格的所有内容',\n it: 'Mostra tutto il contenuto della tabella',\n pt: 'Mostrar todo o conteúdo da tabela',\n hi: 'सभी तालिका सामग्री दिखाएं',\n ar: 'اظهار جميع محتويات الجدول',\n ru: 'Показать все данные таблицы',\n tr: 'Tüm tablo içeriğini göster',\n pl: 'Pokaż całą zawartość tabeli',\n id: 'Tampilkan semua isi tabel',\n vi: 'Hiển thị tất cả nội dung bảng',\n uk: 'Показати весь вміст таблиці',\n }),\n description: t({\n en: 'Open the table in a modal to view all data content clearly',\n fr: 'Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement',\n es: 'Abrir la tabla en una ventana flotante para ver todo el contenido claramente',\n 'en-GB': 'Open the table in a modal to view all data content clearly',\n de: 'Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen',\n ja: 'テーブルをモーダルで開き、すべてのデータを明確に表示',\n ko: '테이블을 모달로 열어 모든 데이터를 명확하게 확인',\n zh: '在弹窗中打开表格以清晰地查看所有数据',\n it: 'Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro',\n pt: 'Abrir a tabela em um modal para ver todo o conteúdo claramente',\n hi: 'सभी डेटा सामग्री को स्पष्ट रूप से देखने के लिए तालिका को मोडल में खोलें',\n ar: 'افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح',\n ru: 'Открыть таблицу в модальном окне для четкого просмотра всех данных',\n tr: 'Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın',\n pl: 'Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość',\n id: 'Buka tabel dalam modal untuk melihat semua isi data dengan jelas',\n vi: 'Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng',\n uk: 'Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані',\n }),\n },\n },\n title: 'Table component content',\n description:\n 'Content declaration related to the Table component, specifically for UI message to display all table content.',\n tags: ['table', 'component content', 'design system'],\n} satisfies Dictionary;\n\nexport default tableContent;\n"],"mappings":";;;AAEA,MAAM,eAAe;CACnB,KAAK;CACL,SAAS,EACP,OAAO;EACL,OAAO,EAAE;GACP,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACF,aAAa,EAAE;GACb,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACH,EACF;CACD,OAAO;CACP,aACE;CACF,MAAM;EAAC;EAAS;EAAqB;EAAgB;CACtD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/components/Table/useTableWidths.ts
|
|
4
|
+
const CHAR_WIDTH_REM = .55;
|
|
5
|
+
const MIN_WIDTH_REM = 5;
|
|
6
|
+
const MAX_WIDTH_REM = 30;
|
|
7
|
+
const useTableWidths = (tableRef, modalTableRef, dependencies) => {
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (!tableRef.current) return;
|
|
10
|
+
const colLengths = [];
|
|
11
|
+
Array.from(tableRef.current.querySelectorAll("tr")).forEach((row) => {
|
|
12
|
+
Array.from(row.children).forEach((cell, index) => {
|
|
13
|
+
const len = cell.textContent?.trim().length ?? 0;
|
|
14
|
+
if (colLengths[index] === void 0 || len > colLengths[index]) colLengths[index] = len;
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
const applyToTable = (table) => {
|
|
18
|
+
const rows = Array.from(table.querySelectorAll("tr"));
|
|
19
|
+
if (rows.length === 0) return;
|
|
20
|
+
const applyColStyle = (el, index) => {
|
|
21
|
+
const minRem = Math.min(MAX_WIDTH_REM, Math.max(MIN_WIDTH_REM, (colLengths[index] ?? 0) * CHAR_WIDTH_REM));
|
|
22
|
+
el.style.minWidth = `${minRem}rem`;
|
|
23
|
+
el.style.maxWidth = `${MAX_WIDTH_REM}rem`;
|
|
24
|
+
};
|
|
25
|
+
table.querySelectorAll("th").forEach((th, index) => {
|
|
26
|
+
applyColStyle(th, index);
|
|
27
|
+
});
|
|
28
|
+
rows.forEach((row) => {
|
|
29
|
+
row.querySelectorAll("td").forEach((td, index) => {
|
|
30
|
+
applyColStyle(td, index);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
applyToTable(tableRef.current);
|
|
35
|
+
if (modalTableRef.current) applyToTable(modalTableRef.current);
|
|
36
|
+
}, dependencies);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//#endregion
|
|
40
|
+
export { useTableWidths };
|
|
41
|
+
//# sourceMappingURL=useTableWidths.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableWidths.mjs","names":[],"sources":["../../../../src/components/Table/useTableWidths.ts"],"sourcesContent":["import { type RefObject, useEffect } from 'react';\n\n// ~0.55rem per character (mid-point for proportional fonts)\nconst CHAR_WIDTH_REM = 0.55;\nconst MIN_WIDTH_REM = 5; // ~80px at 16px base\nconst MAX_WIDTH_REM = 30; // ~480px at 16px base\n\nexport const useTableWidths = (\n tableRef: RefObject<HTMLTableElement | null>,\n modalTableRef: RefObject<HTMLTableElement | null>,\n dependencies: any[]\n) => {\n useEffect(() => {\n if (!tableRef.current) return;\n\n // Calculate the maximum character length per column from the main table\n const colLengths: number[] = [];\n Array.from(tableRef.current.querySelectorAll('tr')).forEach((row) => {\n Array.from(row.children).forEach((cell, index) => {\n const len = cell.textContent?.trim().length ?? 0;\n if (colLengths[index] === undefined || len > colLengths[index]) {\n colLengths[index] = len;\n }\n });\n });\n\n const applyToTable = (table: HTMLTableElement) => {\n const rows = Array.from(table.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const applyColStyle = (el: HTMLElement, index: number) => {\n const minRem = Math.min(\n MAX_WIDTH_REM,\n Math.max(MIN_WIDTH_REM, (colLengths[index] ?? 0) * CHAR_WIDTH_REM)\n );\n el.style.minWidth = `${minRem}rem`;\n el.style.maxWidth = `${MAX_WIDTH_REM}rem`;\n };\n\n table.querySelectorAll('th').forEach((th, index) => {\n applyColStyle(th, index);\n });\n rows.forEach((row) => {\n row.querySelectorAll('td').forEach((td, index) => {\n applyColStyle(td, index);\n });\n });\n };\n\n applyToTable(tableRef.current);\n\n if (modalTableRef.current) applyToTable(modalTableRef.current);\n }, dependencies);\n};\n"],"mappings":";;;AAGA,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AAEtB,MAAa,kBACX,UACA,eACA,iBACG;AACH,iBAAgB;AACd,MAAI,CAAC,SAAS,QAAS;EAGvB,MAAM,aAAuB,EAAE;AAC/B,QAAM,KAAK,SAAS,QAAQ,iBAAiB,KAAK,CAAC,CAAC,SAAS,QAAQ;AACnE,SAAM,KAAK,IAAI,SAAS,CAAC,SAAS,MAAM,UAAU;IAChD,MAAM,MAAM,KAAK,aAAa,MAAM,CAAC,UAAU;AAC/C,QAAI,WAAW,WAAW,UAAa,MAAM,WAAW,OACtD,YAAW,SAAS;KAEtB;IACF;EAEF,MAAM,gBAAgB,UAA4B;GAChD,MAAM,OAAO,MAAM,KAAK,MAAM,iBAAiB,KAAK,CAAC;AACrD,OAAI,KAAK,WAAW,EAAG;GAEvB,MAAM,iBAAiB,IAAiB,UAAkB;IACxD,MAAM,SAAS,KAAK,IAClB,eACA,KAAK,IAAI,gBAAgB,WAAW,UAAU,KAAK,eAAe,CACnE;AACD,OAAG,MAAM,WAAW,GAAG,OAAO;AAC9B,OAAG,MAAM,WAAW,GAAG,cAAc;;AAGvC,SAAM,iBAAiB,KAAK,CAAC,SAAS,IAAI,UAAU;AAClD,kBAAc,IAAI,MAAM;KACxB;AACF,QAAK,SAAS,QAAQ;AACpB,QAAI,iBAAiB,KAAK,CAAC,SAAS,IAAI,UAAU;AAChD,mBAAc,IAAI,MAAM;MACxB;KACF;;AAGJ,eAAa,SAAS,QAAQ;AAE9B,MAAI,cAAc,QAAS,cAAa,cAAc,QAAQ;IAC7D,aAAa"}
|