@flamingo-stack/openframe-frontend-core 0.0.702 → 0.0.703-snapshot.20261006080901
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/{chunk-CYYTD5ZK.cjs → chunk-262YQFOS.cjs} +47 -47
- package/dist/{chunk-SAA7B3DA.js → chunk-2G546OND.js} +500 -67
- package/dist/{chunk-6JPQDYYY.js → chunk-2JDVL7UV.js} +2614 -2001
- package/dist/{chunk-ASN65P3F.cjs → chunk-4DQMTBMK.cjs} +15 -15
- package/dist/{chunk-CZ34HXDW.js → chunk-4KGXLVCF.js} +686 -725
- package/dist/{chunk-TCZCMD5Q.js → chunk-5HBHO5TB.js} +1 -1
- package/dist/{chunk-446KS5BG.js → chunk-5QJDM6UV.js} +5 -5
- package/dist/{chunk-UJJWTJ6S.js → chunk-6WQIUQUC.js} +30 -16
- package/dist/{chunk-YR6JPJF4.js → chunk-6XIF2Z7I.js} +4 -4
- package/dist/{chunk-YGRHITPY.cjs → chunk-7JIL3WOH.cjs} +24 -24
- package/dist/{chunk-RS7HWAYX.js → chunk-7LFIKJX2.js} +3 -3
- package/dist/{chunk-4OGAXAEG.cjs → chunk-ABU3TGXA.cjs} +3 -3
- package/dist/{chunk-3WSFIV5G.cjs → chunk-AMYY3PNL.cjs} +69 -55
- package/dist/{chunk-BRXOGCH3.cjs → chunk-BIZNSF3U.cjs} +3 -3
- package/dist/{chunk-2A4XES7R.cjs → chunk-BM5MVGH3.cjs} +3 -3
- package/dist/{chunk-IIMICN7L.cjs → chunk-C3BWIU7R.cjs} +4 -44
- package/dist/{chunk-LZNJH23A.cjs → chunk-C7XGRLT5.cjs} +12 -12
- package/dist/{chunk-6YCXA7CN.js → chunk-CH5232HV.js} +20 -19
- package/dist/{chunk-UIBSSVON.cjs → chunk-D7BTSVMS.cjs} +2 -2
- package/dist/{chunk-BO5ZHDA4.js → chunk-ERCV6HHJ.js} +7 -7
- package/dist/{chunk-5V6O73EH.js → chunk-FLKJYMVB.js} +3 -3
- package/dist/{chunk-Z5HDCZAS.js → chunk-FXENTYE5.js} +15 -15
- package/dist/{chunk-HIXGAY2L.cjs → chunk-HFJW24JJ.cjs} +121 -121
- package/dist/{chunk-HPJ4XS2L.js → chunk-HJAYVKWQ.js} +24 -24
- package/dist/{chunk-PLK6GHN7.js → chunk-I7DFUQMN.js} +10 -10
- package/dist/{chunk-KJ5LWATV.js → chunk-IHU5ANUY.js} +7 -7
- package/dist/{chunk-AEQANLBW.cjs → chunk-IZGDG5X6.cjs} +505 -72
- package/dist/{chunk-2V4Z44G6.js → chunk-JEYRXT5L.js} +17 -17
- package/dist/{chunk-B3LZJ6J3.cjs → chunk-L3IC42IF.cjs} +32 -32
- package/dist/{chunk-RTGPIHVO.cjs → chunk-LDPEQGKT.cjs} +2243 -1630
- package/dist/{chunk-FD4DBTFO.cjs → chunk-LTSTC3N5.cjs} +1253 -1292
- package/dist/{chunk-OGLCD3UL.js → chunk-MFFCUVWG.js} +6 -6
- package/dist/{chunk-3L7KCOGO.cjs → chunk-MGGGBHYD.cjs} +30 -30
- package/dist/{chunk-QFW3RUZS.cjs → chunk-MI3JUJ75.cjs} +33 -33
- package/dist/{chunk-EMCQGFXD.cjs → chunk-MMOODW57.cjs} +28 -27
- package/dist/{chunk-Q76ZTHNV.js → chunk-MP2C3LJ4.js} +1 -1
- package/dist/{chunk-E3DH543A.cjs → chunk-N3TO7JV3.cjs} +98 -98
- package/dist/{chunk-2T6QWNXU.js → chunk-NDESEPW5.js} +99 -11
- package/dist/{chunk-ETFFEA3J.js → chunk-NRLJUBCS.js} +7 -7
- package/dist/{chunk-HUOLB7ZN.cjs → chunk-OHFS7VOU.cjs} +9 -9
- package/dist/{chunk-MWUBBBWZ.js → chunk-QVSFBSWV.js} +10 -10
- package/dist/{chunk-MDBHZBW7.cjs → chunk-RKV5B7EU.cjs} +92 -4
- package/dist/{chunk-3G76LRGL.cjs → chunk-SYXQLETR.cjs} +29 -29
- package/dist/{chunk-FHM7GD5B.cjs → chunk-UK62YTH6.cjs} +28 -14
- package/dist/{chunk-HUMWQMCU.js → chunk-UT4YHQZW.js} +3 -3
- package/dist/{chunk-NGJCWEYX.cjs → chunk-VHCACDKP.cjs} +46 -46
- package/dist/{chunk-5FFNNJM7.js → chunk-VR2ZLFCP.js} +1 -1
- package/dist/{chunk-IZKOQVXO.js → chunk-VTASHWER.js} +14 -14
- package/dist/{chunk-64O4L7WN.js → chunk-WUJNYGO2.js} +11 -51
- package/dist/{chunk-JOY6HVPV.js → chunk-XATTBO5X.js} +25 -11
- package/dist/{chunk-L7KZA7ZD.cjs → chunk-XIFOBQRQ.cjs} +6 -6
- package/dist/{chunk-CXDJUKC6.cjs → chunk-XJKZ4IKT.cjs} +4 -4
- package/dist/{chunk-XCIFHW4E.cjs → chunk-XOYH2YQE.cjs} +2 -2
- package/dist/{chunk-HYFLTFFB.js → chunk-ZQFZSFQI.js} +2 -2
- package/dist/components/case-studies/index.cjs +24 -24
- package/dist/components/case-studies/index.js +10 -10
- package/dist/components/chat/chat-archive-page.d.ts +3 -3
- package/dist/components/chat/chat-archive-page.d.ts.map +1 -1
- package/dist/components/chat/chat-nav-sidebar.d.ts +4 -0
- package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -1
- package/dist/components/chat/chat-panel-header.d.ts +3 -2
- package/dist/components/chat/chat-panel-header.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.d.ts +36 -2
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +14 -6
- package/dist/components/chat/index.d.ts +4 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +13 -5
- package/dist/components/chat/mingo-archive-list.d.ts +17 -0
- package/dist/components/chat/mingo-archive-list.d.ts.map +1 -0
- package/dist/components/chat/mingo-chat-header.d.ts +31 -0
- package/dist/components/chat/mingo-chat-header.d.ts.map +1 -0
- package/dist/components/chat/mingo-chat-rail.d.ts +54 -0
- package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -0
- package/dist/components/chat/model-display.d.ts.map +1 -1
- package/dist/components/contact/contact-form.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +11 -11
- package/dist/components/contact/index.js +10 -10
- package/dist/components/content-loading-container.d.ts +1 -1
- package/dist/components/content-loading-container.d.ts.map +1 -1
- package/dist/components/docs/index.cjs +14 -14
- package/dist/components/docs/index.js +13 -13
- package/dist/components/docs/skeletons.d.ts.map +1 -1
- package/dist/components/embeds/index.cjs +11 -11
- package/dist/components/embeds/index.js +10 -10
- package/dist/components/faq/index.cjs +12 -12
- package/dist/components/faq/index.js +11 -11
- package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
- package/dist/components/features/index.cjs +10 -10
- package/dist/components/features/index.js +9 -9
- package/dist/components/features/media-gallery-manager.d.ts.map +1 -1
- package/dist/components/features/parallax-image-showcase.d.ts.map +1 -1
- package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
- package/dist/components/features/section-selector.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +119 -119
- package/dist/components/help-center-pages/index.js +39 -39
- package/dist/components/help-center-pages/trust-center-sections.d.ts +2 -2
- package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
- package/dist/components/index.cjs +94 -86
- package/dist/components/index.js +32 -24
- package/dist/components/layout/article-detail-layout.d.ts +1 -1
- package/dist/components/layout/article-detail-layout.d.ts.map +1 -1
- package/dist/components/layout/page-container.d.ts.map +1 -1
- package/dist/components/layout/title-block.d.ts +2 -2
- package/dist/components/layout/title-block.d.ts.map +1 -1
- package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
- package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/booking-form.d.ts +4 -4
- package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +127 -127
- package/dist/components/meeting-scheduler/index.d.ts +2 -2
- package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.js +50 -50
- package/dist/components/navigation/app-header.d.ts +4 -0
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/app-layout-drawer.d.ts.map +1 -1
- package/dist/components/navigation/app-layout-side-panel.d.ts +142 -0
- package/dist/components/navigation/app-layout-side-panel.d.ts.map +1 -0
- package/dist/components/navigation/app-layout.d.ts +11 -1
- package/dist/components/navigation/app-layout.d.ts.map +1 -1
- package/dist/components/navigation/header-mingo-button.d.ts +4 -1
- package/dist/components/navigation/header-mingo-button.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +13 -13
- package/dist/components/navigation/index.d.ts +1 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +12 -12
- package/dist/components/navigation/navigation-sidebar.d.ts +8 -1
- package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
- package/dist/components/navigation/sliding-sidebar.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +14 -14
- package/dist/components/onboarding-guides/index.js +13 -13
- package/dist/components/persistent-filter-controls.d.ts.map +1 -1
- package/dist/components/related-content/index.cjs +7 -7
- package/dist/components/related-content/index.js +6 -6
- package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
- package/dist/components/tickets/help-center-create-form.d.ts +4 -4
- package/dist/components/tickets/index.cjs +15 -15
- package/dist/components/tickets/index.js +14 -14
- package/dist/components/ui/announcement-bar-view.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/checkbox-block.d.ts.map +1 -1
- package/dist/components/ui/dashboard-info-card.d.ts +1 -1
- package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-body.d.ts +2 -2
- package/dist/components/ui/data-table/data-table-skeleton.d.ts +2 -2
- package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/data-table/utils.d.ts +2 -2
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/drawer.d.ts +7 -3
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/entity-image.d.ts +2 -2
- package/dist/components/ui/file-manager/index.cjs +36 -36
- package/dist/components/ui/file-manager/index.js +3 -3
- package/dist/components/ui/filter-modal.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +18 -10
- package/dist/components/ui/index.js +17 -9
- package/dist/components/ui/info-card-row.d.ts.map +1 -1
- package/dist/components/ui/menubar.d.ts +1 -1
- package/dist/components/ui/menubar.d.ts.map +1 -1
- package/dist/components/ui/modal-v2.d.ts.map +1 -1
- package/dist/components/ui/modal.d.ts.map +1 -1
- package/dist/components/ui/no-data/no-data-actions.d.ts.map +1 -1
- package/dist/components/ui/no-data/no-data-styles.d.ts +1 -1
- package/dist/components/ui/no-data/no-data-styles.d.ts.map +1 -1
- package/dist/components/ui/page-actions.d.ts.map +1 -1
- package/dist/components/ui/panel-resize-handle.d.ts +25 -0
- package/dist/components/ui/panel-resize-handle.d.ts.map +1 -0
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/table/table-skeleton.d.ts +1 -1
- package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
- package/dist/hooks/index.cjs +23 -9
- package/dist/hooks/index.js +24 -10
- package/dist/hooks/ui/index.d.ts +1 -0
- package/dist/hooks/ui/index.d.ts.map +1 -1
- package/dist/hooks/ui/use-content-breakpoint.d.ts +32 -0
- package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -0
- package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts +2 -2
- package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts.map +1 -1
- package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
- package/dist/hooks/ui/use-resizable-panel-size.d.ts +46 -0
- package/dist/hooks/ui/use-resizable-panel-size.d.ts.map +1 -0
- package/dist/index.cjs +39 -17
- package/dist/index.js +41 -19
- package/dist/styles/layout-steps.d.ts +30 -0
- package/dist/styles/layout-steps.d.ts.map +1 -0
- package/dist/tailwind.config.cjs +36 -11
- package/dist/tailwind.config.js +36 -11
- package/eslint-config/README.md +9 -0
- package/eslint-config/base.js +17 -1
- package/eslint-config/layout-variants.js +57 -0
- package/package.json +3 -1
- package/src/ODS_TOKEN_RULES.md +40 -0
- package/src/components/chat/chat-archive-page.tsx +9 -7
- package/src/components/chat/chat-nav-sidebar.tsx +10 -4
- package/src/components/chat/chat-panel-header.tsx +8 -5
- package/src/components/chat/embeddable-chat.tsx +686 -494
- package/src/components/chat/index.ts +4 -0
- package/src/components/chat/mingo-archive-list.tsx +108 -0
- package/src/components/chat/mingo-chat-header.tsx +104 -0
- package/src/components/chat/mingo-chat-rail.tsx +361 -0
- package/src/components/chat/model-display.tsx +8 -1
- package/src/components/contact/contact-form.tsx +11 -9
- package/src/components/content-loading-container.tsx +4 -2
- package/src/components/docs/doc-viewer.tsx +7 -7
- package/src/components/docs/skeletons.tsx +7 -4
- package/src/components/dynamic-skeleton.tsx +1 -1
- package/src/components/embeds/claude-embed.tsx +1 -1
- package/src/components/embeds/embed-viewer-frame.tsx +4 -4
- package/src/components/embeds/figma-embed.tsx +2 -2
- package/src/components/embeds/google-sheets-viewer.tsx +1 -1
- package/src/components/embeds/pdf-viewer.tsx +3 -3
- package/src/components/empty-state.tsx +6 -6
- package/src/components/faq/faq-section.tsx +2 -2
- package/src/components/faq-accordion.tsx +1 -1
- package/src/components/features/board/board-column-header.tsx +1 -1
- package/src/components/features/command-box.tsx +3 -3
- package/src/components/features/entity-video-section.tsx +2 -2
- package/src/components/features/figma-prototype-viewer.tsx +4 -1
- package/src/components/features/media-gallery-manager.tsx +3 -1
- package/src/components/features/parallax-image-showcase.tsx +9 -6
- package/src/components/features/policy-configuration-panel.tsx +9 -7
- package/src/components/features/provider-button.tsx +1 -1
- package/src/components/features/section-selector.tsx +11 -6
- package/src/components/features/select-button.tsx +4 -4
- package/src/components/features/seo-editor-preview.tsx +2 -2
- package/src/components/features/video-ratio-tabs.tsx +3 -3
- package/src/components/features/waitlist-form.tsx +1 -1
- package/src/components/help-center-pages/trust-center-page.tsx +1 -1
- package/src/components/help-center-pages/trust-center-sections.tsx +14 -14
- package/src/components/icon-display.tsx +1 -1
- package/src/components/layout/article-detail-layout.tsx +4 -2
- package/src/components/layout/list-page-layout.tsx +2 -2
- package/src/components/layout/page-container.tsx +26 -14
- package/src/components/layout/page-heading.tsx +1 -1
- package/src/components/layout/page-layout.tsx +1 -1
- package/src/components/layout/title-block.tsx +13 -13
- package/src/components/loading/card-skeleton.tsx +11 -11
- package/src/components/loading/category-vendor-selector-skeleton.tsx +1 -1
- package/src/components/loading/content-skeleton.tsx +6 -6
- package/src/components/loading/device-card-skeleton.tsx +1 -1
- package/src/components/loading/margin-report-skeleton.tsx +7 -7
- package/src/components/loading/msp-profile-form-skeleton.tsx +3 -3
- package/src/components/loading/organization-card-skeleton.tsx +2 -2
- package/src/components/loading/page-layout-skeleton.tsx +80 -68
- package/src/components/loading/unified-skeleton.tsx +16 -6
- package/src/components/media-carousel.tsx +3 -3
- package/src/components/meeting-scheduler/booking-form.tsx +9 -8
- package/src/components/meeting-scheduler/context-panel.tsx +8 -6
- package/src/components/meeting-scheduler/directory.tsx +4 -4
- package/src/components/meeting-scheduler/index.tsx +15 -15
- package/src/components/meeting-scheduler/slot-picker.tsx +12 -12
- package/src/components/navigation/app-header.tsx +6 -0
- package/src/components/navigation/app-layout-drawer.tsx +14 -237
- package/src/components/navigation/app-layout-side-panel.tsx +594 -0
- package/src/components/navigation/app-layout.tsx +69 -4
- package/src/components/navigation/header-mingo-button.tsx +13 -3
- package/src/components/navigation/index.ts +5 -0
- package/src/components/navigation/navigation-sidebar.tsx +17 -3
- package/src/components/navigation/sliding-sidebar.tsx +2 -1
- package/src/components/pagination.tsx +3 -3
- package/src/components/persistent-filter-controls.tsx +6 -2
- package/src/components/platform/ScriptArguments.tsx +1 -1
- package/src/components/platform/ScriptInfoSection.tsx +4 -4
- package/src/components/shared/article-author-byline.tsx +1 -1
- package/src/components/shared/delivery/delivery-lists.tsx +2 -2
- package/src/components/shared/delivery/delivery-row.tsx +7 -7
- package/src/components/shared/delivery/delivery-table.tsx +3 -3
- package/src/components/shared/detail-page-skeleton.tsx +11 -5
- package/src/components/shared/dev-section/dev-card-row.tsx +6 -6
- package/src/components/shared/dev-section/dev-section-view.tsx +1 -1
- package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -8
- package/src/components/shared/product-release/product-release-card.tsx +9 -9
- package/src/components/shared/product-release/product-releases-view.tsx +1 -1
- package/src/components/shared/product-release/release-detail-page.tsx +5 -5
- package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +1 -1
- package/src/components/shared/roadmap/roadmap-grid.tsx +3 -3
- package/src/components/tickets/help-center-card.tsx +1 -1
- package/src/components/tickets/help-center-create-form.tsx +12 -12
- package/src/components/ui/announcement-bar-view.tsx +2 -10
- package/src/components/ui/benefit-card.tsx +18 -18
- package/src/components/ui/brand-association-grid.tsx +4 -4
- package/src/components/ui/breadcrumb.tsx +4 -1
- package/src/components/ui/card.tsx +1 -1
- package/src/components/ui/checkbox-block.tsx +9 -7
- package/src/components/ui/content-loader.tsx +3 -3
- package/src/components/ui/cursor-pagination.tsx +3 -3
- package/src/components/ui/dashboard-info-card.tsx +13 -9
- package/src/components/ui/data-attribution.tsx +2 -2
- package/src/components/ui/data-table/data-table-body.tsx +2 -2
- package/src/components/ui/data-table/data-table-header.tsx +15 -15
- package/src/components/ui/data-table/data-table-skeleton.tsx +6 -6
- package/src/components/ui/data-table/utils.ts +5 -5
- package/src/components/ui/dialog.tsx +4 -1
- package/src/components/ui/drawer.tsx +43 -189
- package/src/components/ui/duration-input.tsx +1 -1
- package/src/components/ui/entity-image.tsx +3 -3
- package/src/components/ui/feature-card.tsx +10 -10
- package/src/components/ui/file-manager/file-manager-action-bar.tsx +1 -1
- package/src/components/ui/file-manager/file-manager.tsx +1 -1
- package/src/components/ui/filter-modal.tsx +8 -1
- package/src/components/ui/highlight-card.tsx +7 -7
- package/src/components/ui/info-card-row.tsx +10 -6
- package/src/components/ui/modal-v2.tsx +7 -2
- package/src/components/ui/modal.tsx +3 -2
- package/src/components/ui/no-data/no-data-actions.tsx +10 -4
- package/src/components/ui/no-data/no-data-styles.ts +1 -1
- package/src/components/ui/no-data/no-data.tsx +1 -1
- package/src/components/ui/organization-card.tsx +1 -1
- package/src/components/ui/page-actions.tsx +34 -5
- package/src/components/ui/panel-resize-handle.tsx +184 -0
- package/src/components/ui/progress-bar.tsx +2 -2
- package/src/components/ui/query-report-table/query-report-table.tsx +1 -1
- package/src/components/ui/search-input.tsx +2 -2
- package/src/components/ui/service-card.tsx +2 -2
- package/src/components/ui/sheet.tsx +2 -1
- package/src/components/ui/skeleton.tsx +3 -3
- package/src/components/ui/stacked-rows-panel.tsx +4 -4
- package/src/components/ui/tab-navigation.tsx +2 -2
- package/src/components/ui/tab-selector.tsx +2 -2
- package/src/components/ui/table/table-header.tsx +3 -3
- package/src/components/ui/table/table-skeleton.tsx +3 -3
- package/src/components/ui/table/utils.ts +5 -5
- package/src/components/ui/tag-search-input.tsx +3 -3
- package/src/components/ui/tags-manager.tsx +5 -5
- package/src/components/ui/test-run.tsx +2 -2
- package/src/components/ui/ticket-info-section.tsx +1 -1
- package/src/components/ui/ticket-notes-section.tsx +1 -1
- package/src/components/ui/ticket-status-config-row.tsx +15 -15
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/use-content-breakpoint.ts +58 -0
- package/src/hooks/ui/use-media-query.ts +3 -2
- package/src/hooks/ui/use-resizable-panel-size.ts +114 -0
- package/src/styles/index.css +2 -0
- package/src/styles/layout-steps.ts +14 -0
- package/src/styles/ods-colors.css +15 -0
- package/src/styles/ods-content-area-tokens.css +27 -0
- package/src/styles/ods-content-area.css +31 -0
- package/src/styles/ods-effects.css +4 -2
- package/src/styles/ods-responsive-tokens.css +14 -4
- package/tailwind.config.ts +42 -7
|
@@ -62,7 +62,7 @@ export function ContentLoadingContainer({
|
|
|
62
62
|
children,
|
|
63
63
|
skeletonComponent,
|
|
64
64
|
className,
|
|
65
|
-
minHeight = 'min-h-[300px] md:min-h-[800px]',
|
|
65
|
+
minHeight = 'min-h-[300px] content-md:min-h-[800px]',
|
|
66
66
|
loadingOpacity = 1,
|
|
67
67
|
transitionDuration = 300,
|
|
68
68
|
}: ContentLoadingContainerProps) {
|
|
@@ -120,7 +120,9 @@ export function useContentLoading(isLoading: boolean) {
|
|
|
120
120
|
|
|
121
121
|
const getMinHeight = (contentType: 'vendor' | 'blog') => {
|
|
122
122
|
// Vendor cards are typically taller, need more space
|
|
123
|
-
return contentType === 'vendor'
|
|
123
|
+
return contentType === 'vendor'
|
|
124
|
+
? 'min-h-[400px] content-md:min-h-[900px]'
|
|
125
|
+
: 'min-h-[300px] content-md:min-h-[800px]';
|
|
124
126
|
};
|
|
125
127
|
|
|
126
128
|
return {
|
|
@@ -292,9 +292,9 @@ function DocViewerContent({
|
|
|
292
292
|
)}
|
|
293
293
|
|
|
294
294
|
{!error && (
|
|
295
|
-
<div className="flex flex-1 flex-col items-start gap-6 lg:flex-row lg:gap-10">
|
|
296
|
-
<div className="w-full lg:w-[320px] lg:shrink-0">
|
|
297
|
-
<div className="lg:sticky lg:top-20">
|
|
295
|
+
<div className="flex flex-1 flex-col items-start gap-6 content-lg:flex-row content-lg:gap-10">
|
|
296
|
+
<div className="w-full content-lg:w-[320px] content-lg:shrink-0">
|
|
297
|
+
<div className="content-lg:sticky content-lg:top-20">
|
|
298
298
|
{isLoadingStructure ? (
|
|
299
299
|
<CategorySidebarSkeleton />
|
|
300
300
|
) : (
|
|
@@ -312,7 +312,7 @@ function DocViewerContent({
|
|
|
312
312
|
</PersistentMobileDropdown>
|
|
313
313
|
|
|
314
314
|
<PersistentSidebar isLoading={false}>
|
|
315
|
-
<div className="hidden lg:block">
|
|
315
|
+
<div className="hidden content-lg:block">
|
|
316
316
|
<div className="space-y-4">
|
|
317
317
|
<h3 className="font-semibold text-ods-text-secondary text-h5">{sidebarLabel}</h3>
|
|
318
318
|
<MultiLevelNavigation
|
|
@@ -343,7 +343,7 @@ function DocViewerContent({
|
|
|
343
343
|
// shouldn't be on file pages" bug.
|
|
344
344
|
isMarkdownContent &&
|
|
345
345
|
((showStickyNav && stickyNavSections.length > 0) || isLoadingContent || isLoadingStructure)
|
|
346
|
-
? 'lg:grid-cols-[1fr_280px]'
|
|
346
|
+
? 'content-lg:grid-cols-[1fr_280px]'
|
|
347
347
|
: ''
|
|
348
348
|
} gap-8`}
|
|
349
349
|
>
|
|
@@ -366,7 +366,7 @@ function DocViewerContent({
|
|
|
366
366
|
</div>
|
|
367
367
|
|
|
368
368
|
{isMarkdownContent && (isLoadingContent || isLoadingStructure) && (
|
|
369
|
-
<div className="hidden lg:block">
|
|
369
|
+
<div className="hidden content-lg:block">
|
|
370
370
|
<div className="sticky top-24">
|
|
371
371
|
<div className="mb-5 h-[14px] w-28 animate-pulse rounded bg-ods-border" />
|
|
372
372
|
<div className="space-y-0">
|
|
@@ -386,7 +386,7 @@ function DocViewerContent({
|
|
|
386
386
|
)}
|
|
387
387
|
|
|
388
388
|
{showStickyNav && content && stickyNavSections.length > 0 && !isLoadingContent && (
|
|
389
|
-
<div className="hidden lg:block">
|
|
389
|
+
<div className="hidden content-lg:block">
|
|
390
390
|
<div className="sticky top-24">
|
|
391
391
|
<h3 className="mb-4 font-semibold text-ods-text-secondary text-h5">ON THIS PAGE</h3>
|
|
392
392
|
<StickySectionNav
|
|
@@ -107,18 +107,21 @@ export function EmbedSkeleton({ documentType }: EmbedSkeletonProps = {}) {
|
|
|
107
107
|
return (
|
|
108
108
|
<div className="space-y-4">
|
|
109
109
|
{/* Header — matches the actual viewer's
|
|
110
|
-
* `flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`
|
|
110
|
+
* `flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between`
|
|
111
111
|
* (mobile-stacked, desktop-row). */}
|
|
112
|
-
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
|
112
|
+
<div className="flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between">
|
|
113
113
|
{/* Left: icon + title */}
|
|
114
114
|
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
115
115
|
<div className="h-5 w-5 shrink-0 animate-pulse rounded bg-ods-border" />
|
|
116
116
|
<div className="h-6 w-2/3 animate-pulse rounded bg-ods-border" />
|
|
117
117
|
</div>
|
|
118
118
|
{/* Right: 1 or 2 buttons. Mobile = full-width; desktop = auto. */}
|
|
119
|
-
<div className="flex w-full items-center gap-2 sm:w-auto">
|
|
119
|
+
<div className="flex w-full items-center gap-2 content-sm:w-auto">
|
|
120
120
|
{Array.from({ length: buttonCount }).map((_, i) => (
|
|
121
|
-
<div
|
|
121
|
+
<div
|
|
122
|
+
key={i}
|
|
123
|
+
className="h-10 w-full flex-1 animate-pulse rounded bg-ods-border content-sm:w-32 content-sm:flex-initial"
|
|
124
|
+
/>
|
|
122
125
|
))}
|
|
123
126
|
</div>
|
|
124
127
|
</div>
|
|
@@ -246,7 +246,7 @@ export const SkeletonPresets = {
|
|
|
246
246
|
* Vendor grid skeleton (specific to the app)
|
|
247
247
|
*/
|
|
248
248
|
VendorGrid: ({ items = 6 }: { items?: number }) => (
|
|
249
|
-
<div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
|
|
249
|
+
<div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
|
|
250
250
|
{Array.from({ length: items }, (_, index) => (
|
|
251
251
|
<div key={index} className="space-y-3 rounded-lg border border-ods-border bg-ods-card p-4">
|
|
252
252
|
<div className="flex items-center gap-3">
|
|
@@ -79,7 +79,7 @@ export function ClaudeEmbed({ url, kind = 'artifact', title, height, loading = '
|
|
|
79
79
|
openInNewTab
|
|
80
80
|
leftIcon={<ClaudeIcon className="h-4 w-4" />}
|
|
81
81
|
rightIcon={<ExternalLink className="h-4 w-4" />}
|
|
82
|
-
className="w-full sm:w-auto"
|
|
82
|
+
className="w-full content-sm:w-auto"
|
|
83
83
|
>
|
|
84
84
|
Open in Claude
|
|
85
85
|
</Button>
|
|
@@ -121,7 +121,7 @@ export function EmbedViewerFrame({
|
|
|
121
121
|
isFullscreen && 'overflow-auto bg-ods-bg p-[var(--spacing-system-mf)]',
|
|
122
122
|
)}
|
|
123
123
|
>
|
|
124
|
-
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
|
124
|
+
<div className="flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between">
|
|
125
125
|
<div className="flex min-w-0 items-center gap-2">
|
|
126
126
|
{icon}
|
|
127
127
|
{titleVariant === 'h3' ? (
|
|
@@ -133,12 +133,12 @@ export function EmbedViewerFrame({
|
|
|
133
133
|
{/* Same responsive action-row idiom as the PDF viewer's button pair
|
|
134
134
|
and every viewer's own action: full-width stacked on mobile,
|
|
135
135
|
inline row from `sm:` up, SAME Button idiom (outline /
|
|
136
|
-
small-legacy / w-4 icon / w-full sm:w-auto). Without the
|
|
136
|
+
small-legacy / w-4 icon / w-full content-sm:w-auto). Without the
|
|
137
137
|
fullscreen toggle, `actions` renders EXACTLY as before — the
|
|
138
138
|
wrapper exists only when the toggle joins it, so pre-existing
|
|
139
139
|
viewers (figma/pdf/sheets) are byte-identical. */}
|
|
140
140
|
{fullscreenControl && src ? (
|
|
141
|
-
<div className="flex flex-col gap-[var(--spacing-system-xsf)] sm:flex-row sm:items-center">
|
|
141
|
+
<div className="flex flex-col gap-[var(--spacing-system-xsf)] content-sm:flex-row content-sm:items-center">
|
|
142
142
|
{actions}
|
|
143
143
|
<Button
|
|
144
144
|
variant="outline"
|
|
@@ -146,7 +146,7 @@ export function EmbedViewerFrame({
|
|
|
146
146
|
onClick={toggleFullscreen}
|
|
147
147
|
aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}
|
|
148
148
|
leftIcon={isFullscreen ? <Minimize2 className="h-4 w-4" /> : <Maximize2 className="h-4 w-4" />}
|
|
149
|
-
className="w-full sm:w-auto"
|
|
149
|
+
className="w-full content-sm:w-auto"
|
|
150
150
|
>
|
|
151
151
|
{isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
|
|
152
152
|
</Button>
|
|
@@ -105,7 +105,7 @@ export function FigmaEmbed({ url, title, height, loading = 'lazy' }: FigmaEmbedP
|
|
|
105
105
|
title={heading}
|
|
106
106
|
titleVariant="h6"
|
|
107
107
|
actions={
|
|
108
|
-
<div className="flex flex-col gap-2 sm:flex-row sm:items-center">
|
|
108
|
+
<div className="flex flex-col gap-2 content-sm:flex-row content-sm:items-center">
|
|
109
109
|
{isSlides && embedSrc && <SlidesViewToggle view={view} onChange={setView} />}
|
|
110
110
|
{originalUrl && (
|
|
111
111
|
<Button
|
|
@@ -115,7 +115,7 @@ export function FigmaEmbed({ url, title, height, loading = 'lazy' }: FigmaEmbedP
|
|
|
115
115
|
openInNewTab
|
|
116
116
|
leftIcon={<FigmaIcon className="h-4 w-4" />}
|
|
117
117
|
rightIcon={<ExternalLink className="h-4 w-4" />}
|
|
118
|
-
className="w-full sm:w-auto"
|
|
118
|
+
className="w-full content-sm:w-auto"
|
|
119
119
|
>
|
|
120
120
|
Open in Figma
|
|
121
121
|
</Button>
|
|
@@ -38,7 +38,7 @@ export function GoogleSheetsViewer({ externalUrl, fileName, height }: GoogleShee
|
|
|
38
38
|
openInNewTab
|
|
39
39
|
leftIcon={<GoogleSheetsIcon className="h-4 w-4" />}
|
|
40
40
|
rightIcon={<ExternalLink className="h-4 w-4" />}
|
|
41
|
-
className="w-full sm:w-auto"
|
|
41
|
+
className="w-full content-sm:w-auto"
|
|
42
42
|
>
|
|
43
43
|
Open in Google Sheets
|
|
44
44
|
</Button>
|
|
@@ -31,7 +31,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
|
|
|
31
31
|
icon={<AdobePdfIcon className="h-5 w-5 shrink-0" />}
|
|
32
32
|
title={displayName}
|
|
33
33
|
actions={
|
|
34
|
-
<div className="flex w-full items-center gap-2 sm:w-auto">
|
|
34
|
+
<div className="flex w-full items-center gap-2 content-sm:w-auto">
|
|
35
35
|
<Button
|
|
36
36
|
variant="outline"
|
|
37
37
|
size="small-legacy"
|
|
@@ -39,7 +39,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
|
|
|
39
39
|
openInNewTab={!onPreview}
|
|
40
40
|
onClick={onPreview}
|
|
41
41
|
leftIcon={<Eye className="h-4 w-4" />}
|
|
42
|
-
className="flex-1 sm:flex-initial"
|
|
42
|
+
className="flex-1 content-sm:flex-initial"
|
|
43
43
|
>
|
|
44
44
|
Preview
|
|
45
45
|
</Button>
|
|
@@ -50,7 +50,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
|
|
|
50
50
|
openInNewTab={!onDownload}
|
|
51
51
|
onClick={onDownload}
|
|
52
52
|
leftIcon={<Download className="h-4 w-4" />}
|
|
53
|
-
className="flex-1 sm:flex-initial"
|
|
53
|
+
className="flex-1 content-sm:flex-initial"
|
|
54
54
|
>
|
|
55
55
|
Download
|
|
56
56
|
</Button>
|
|
@@ -164,21 +164,21 @@ export function EmptyState({
|
|
|
164
164
|
const ctaButtonVariant = ctaVariant === 'primary' ? 'accent' : 'outline';
|
|
165
165
|
|
|
166
166
|
return (
|
|
167
|
-
<div className="flex flex-col items-center justify-center px-6 py-6 text-center md:py-16">
|
|
167
|
+
<div className="flex flex-col items-center justify-center px-6 py-6 text-center content-md:py-16">
|
|
168
168
|
{/* Icon */}
|
|
169
|
-
<div className="mb-3 flex items-center justify-center md:mb-6">
|
|
170
|
-
<div className="rounded-full border border-ods-border bg-ods-card p-3 md:p-6">
|
|
171
|
-
<div className="flex h-8 w-8 items-center justify-center text-ods-text-secondary md:h-16 md:w-16">
|
|
169
|
+
<div className="mb-3 flex items-center justify-center content-md:mb-6">
|
|
170
|
+
<div className="rounded-full border border-ods-border bg-ods-card p-3 content-md:p-6">
|
|
171
|
+
<div className="flex h-8 w-8 items-center justify-center text-ods-text-secondary content-md:h-16 content-md:w-16">
|
|
172
172
|
{defaultContent.icon}
|
|
173
173
|
</div>
|
|
174
174
|
</div>
|
|
175
175
|
</div>
|
|
176
176
|
|
|
177
177
|
{/* Title */}
|
|
178
|
-
<h2 className="mb-2 text-ods-text-primary text-h3 md:mb-3">{displayTitle}</h2>
|
|
178
|
+
<h2 className="mb-2 text-ods-text-primary text-h3 content-md:mb-3">{displayTitle}</h2>
|
|
179
179
|
|
|
180
180
|
{/* Description */}
|
|
181
|
-
<p className="mb-4 max-w-md text-ods-text-secondary text-h6 md:mb-8">{displayDescription}</p>
|
|
181
|
+
<p className="mb-4 max-w-md text-ods-text-secondary text-h6 content-md:mb-8">{displayDescription}</p>
|
|
182
182
|
|
|
183
183
|
{/* Link CTA (ctaHref) — SSR-safe, no path sniffing */}
|
|
184
184
|
{showCTA && ctaHref && (
|
|
@@ -315,10 +315,10 @@ function GroupedFaqList({
|
|
|
315
315
|
function FaqSkeleton() {
|
|
316
316
|
return (
|
|
317
317
|
<div className="animate-pulse space-y-8">
|
|
318
|
-
<div className="h-12 w-2/3 rounded bg-ods-border md:h-14" />
|
|
318
|
+
<div className="h-12 w-2/3 rounded bg-ods-border content-md:h-14" />
|
|
319
319
|
<div className="w-full divide-y divide-ods-border overflow-hidden rounded-md border border-ods-border bg-transparent">
|
|
320
320
|
{Array.from({ length: 8 }).map((_, idx) => (
|
|
321
|
-
<div key={idx} className="flex items-center justify-between gap-6 px-6 py-4 md:gap-10">
|
|
321
|
+
<div key={idx} className="flex items-center justify-between gap-6 px-6 py-4 content-md:gap-10">
|
|
322
322
|
<div className="h-6 w-5/6 rounded bg-ods-border" />
|
|
323
323
|
<div className="size-6 rounded bg-ods-border" />
|
|
324
324
|
</div>
|
|
@@ -56,7 +56,7 @@ export function FaqAccordion({ items, defaultOpenIds = [] }: FaqAccordionProps)
|
|
|
56
56
|
}
|
|
57
57
|
}}
|
|
58
58
|
aria-expanded={isOpen}
|
|
59
|
-
className="flex w-full cursor-pointer items-center gap-6 px-6 py-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-focus md:gap-10"
|
|
59
|
+
className="flex w-full cursor-pointer items-center gap-6 px-6 py-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-focus content-md:gap-10"
|
|
60
60
|
>
|
|
61
61
|
<h3 className="min-w-0 flex-1 break-words">{item.question}</h3>
|
|
62
62
|
<Chevron02DownIcon
|
|
@@ -29,7 +29,7 @@ export function BoardColumnHeader({
|
|
|
29
29
|
const useStatusVariant = resolveTicketStatus(tagStatus) !== null;
|
|
30
30
|
// The dense header size on every input mode — the mobile mock keeps the
|
|
31
31
|
// lane's info/collapse buttons small, same as desktop.
|
|
32
|
-
const actionClass = 'h-8 w-8 p-0 md:h-8 md:w-8';
|
|
32
|
+
const actionClass = 'h-8 w-8 p-0 content-md:h-8 content-md:w-8';
|
|
33
33
|
|
|
34
34
|
if (collapsed) {
|
|
35
35
|
return (
|
|
@@ -164,7 +164,7 @@ export function CommandBox({
|
|
|
164
164
|
commandText
|
|
165
165
|
)}
|
|
166
166
|
{(primaryAction || secondaryAction) && (
|
|
167
|
-
<div className="mt-4 flex flex-col gap-3 md:flex-row md:justify-end">
|
|
167
|
+
<div className="mt-4 flex flex-col gap-3 content-md:flex-row content-md:justify-end">
|
|
168
168
|
{secondaryAction && (
|
|
169
169
|
<Button
|
|
170
170
|
variant={secondaryAction.variant || 'outline'}
|
|
@@ -172,7 +172,7 @@ export function CommandBox({
|
|
|
172
172
|
onClick={secondaryAction.onClick}
|
|
173
173
|
disabled={secondaryAction.disabled}
|
|
174
174
|
loading={secondaryAction.loading}
|
|
175
|
-
className="w-full md:w-auto"
|
|
175
|
+
className="w-full content-md:w-auto"
|
|
176
176
|
>
|
|
177
177
|
{secondaryAction.label}
|
|
178
178
|
</Button>
|
|
@@ -184,7 +184,7 @@ export function CommandBox({
|
|
|
184
184
|
onClick={primaryAction.onClick}
|
|
185
185
|
disabled={primaryAction.disabled}
|
|
186
186
|
loading={primaryAction.loading}
|
|
187
|
-
className="w-full md:w-auto"
|
|
187
|
+
className="w-full content-md:w-auto"
|
|
188
188
|
>
|
|
189
189
|
{primaryAction.label}
|
|
190
190
|
</Button>
|
|
@@ -143,13 +143,13 @@ export function EntityVideoSection({
|
|
|
143
143
|
<TabsList className="inline-flex h-auto justify-start gap-0 rounded-none bg-transparent p-0">
|
|
144
144
|
<TabsTrigger
|
|
145
145
|
value="full-video"
|
|
146
|
-
className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none md:px-6"
|
|
146
|
+
className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none content-md:px-6"
|
|
147
147
|
>
|
|
148
148
|
Full Video
|
|
149
149
|
</TabsTrigger>
|
|
150
150
|
<TabsTrigger
|
|
151
151
|
value="highlights"
|
|
152
|
-
className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none md:px-6"
|
|
152
|
+
className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none content-md:px-6"
|
|
153
153
|
>
|
|
154
154
|
Highlights
|
|
155
155
|
</TabsTrigger>
|
|
@@ -370,7 +370,10 @@ function UnifiedUI({ state, handlers, config, iframeRef }: UnifiedUIProps) {
|
|
|
370
370
|
|
|
371
371
|
return (
|
|
372
372
|
<div
|
|
373
|
-
className={cn(
|
|
373
|
+
className={cn(
|
|
374
|
+
config.hideControls ? '' : 'grid grid-cols-1 gap-10 content-lg:grid-cols-[296px_1fr]',
|
|
375
|
+
config.className,
|
|
376
|
+
)}
|
|
374
377
|
>
|
|
375
378
|
{/* Section Controls */}
|
|
376
379
|
{showSectionSelector && !config.hideControls && (
|
|
@@ -328,7 +328,9 @@ export function MediaGalleryManager({
|
|
|
328
328
|
<h3 className="text-ods-text-primary text-h3">Media Gallery ({media.length})</h3>
|
|
329
329
|
<p className="text-ods-text-secondary text-h6">Drag to reorder</p>
|
|
330
330
|
</div>
|
|
331
|
-
<div
|
|
331
|
+
<div
|
|
332
|
+
className={cn('grid grid-cols-1 gap-4 content-md:grid-cols-2', columns === 3 && 'content-lg:grid-cols-3')}
|
|
333
|
+
>
|
|
332
334
|
{media.map((item, index) => (
|
|
333
335
|
<Card
|
|
334
336
|
key={item.id ?? `${item.media_url}-${index}`}
|
|
@@ -127,7 +127,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
127
127
|
if (layout === 'grid') {
|
|
128
128
|
return (
|
|
129
129
|
<div ref={componentRef} className={`relative flex h-full w-full items-center ${className}`}>
|
|
130
|
-
<div className="grid w-full grid-cols-1 gap-4 md:grid-cols-3">
|
|
130
|
+
<div className="grid w-full grid-cols-1 gap-4 content-md:grid-cols-3">
|
|
131
131
|
{/* Image #1 - Left */}
|
|
132
132
|
{leftImage && (
|
|
133
133
|
<motion.div
|
|
@@ -206,7 +206,10 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
206
206
|
<div className="absolute inset-x-0 top-32 h-80">
|
|
207
207
|
{/* Left half: Image overlaps to the left */}
|
|
208
208
|
{leftImage && (
|
|
209
|
-
<motion.div
|
|
209
|
+
<motion.div
|
|
210
|
+
className="absolute left-20 z-10 h-full w-full content-lg:w-1/2"
|
|
211
|
+
style={{ x: x, y: y, rotate: rotate }}
|
|
212
|
+
>
|
|
210
213
|
<Image
|
|
211
214
|
src={leftImage.src}
|
|
212
215
|
alt={leftImage.alt}
|
|
@@ -221,7 +224,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
221
224
|
{/* Right half: Image overlaps to the right */}
|
|
222
225
|
{centerImage && (
|
|
223
226
|
<motion.div
|
|
224
|
-
className="absolute right-20 top-20 z-20 h-full w-full lg:w-1/2"
|
|
227
|
+
className="absolute right-20 top-20 z-20 h-full w-full content-lg:w-1/2"
|
|
225
228
|
style={{ x: x, y: y, rotate: rotate }}
|
|
226
229
|
>
|
|
227
230
|
<Image
|
|
@@ -245,7 +248,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
245
248
|
{/* Image #3 - Behind all - z-index 1 */}
|
|
246
249
|
{rightImage && (
|
|
247
250
|
<motion.div
|
|
248
|
-
className="absolute right-[5%] top-[5%] z-[1] h-[60%] w-[80%] lg:right-[-15%] lg:top-[-10%] lg:h-[85%] lg:w-[120%]"
|
|
251
|
+
className="absolute right-[5%] top-[5%] z-[1] h-[60%] w-[80%] content-lg:right-[-15%] content-lg:top-[-10%] content-lg:h-[85%] content-lg:w-[120%]"
|
|
249
252
|
style={{
|
|
250
253
|
x: x,
|
|
251
254
|
y: y,
|
|
@@ -265,7 +268,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
265
268
|
{/* Image #2 - Middle layer - z-index 2 */}
|
|
266
269
|
{centerImage && (
|
|
267
270
|
<motion.div
|
|
268
|
-
className="absolute bottom-[10%] right-[0%] z-[2] h-[55%] w-[75%] lg:bottom-[-15%] lg:right-[-20%] lg:h-[80%] lg:w-[100%]"
|
|
271
|
+
className="absolute bottom-[10%] right-[0%] z-[2] h-[55%] w-[75%] content-lg:bottom-[-15%] content-lg:right-[-20%] content-lg:h-[80%] content-lg:w-[100%]"
|
|
269
272
|
style={{
|
|
270
273
|
x: x,
|
|
271
274
|
y: y,
|
|
@@ -285,7 +288,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
|
|
|
285
288
|
{/* Image #1 - On top - z-index 3 */}
|
|
286
289
|
{leftImage && (
|
|
287
290
|
<motion.div
|
|
288
|
-
className="absolute left-[-5%] top-[10%] z-[3] h-[65%] w-[85%] lg:left-[-25%] lg:top-[0%] lg:h-[90%] lg:w-[110%]"
|
|
291
|
+
className="absolute left-[-5%] top-[10%] z-[3] h-[65%] w-[85%] content-lg:left-[-25%] content-lg:top-[0%] content-lg:h-[90%] content-lg:w-[110%]"
|
|
289
292
|
style={{
|
|
290
293
|
x: x,
|
|
291
294
|
y: y,
|
|
@@ -80,7 +80,7 @@ const PolicyRow: FC<{
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
return (
|
|
83
|
-
<div className="flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 md:items-center">
|
|
83
|
+
<div className="flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 content-md:items-center">
|
|
84
84
|
{/* Tool Icon */}
|
|
85
85
|
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-bg">
|
|
86
86
|
<ToolIcon toolType={policy.toolName} size={16} />
|
|
@@ -93,7 +93,7 @@ const PolicyRow: FC<{
|
|
|
93
93
|
</p>
|
|
94
94
|
<p className="break-all text-ods-text-secondary text-h6">{policy.commandPattern}</p>
|
|
95
95
|
{editMode ? (
|
|
96
|
-
<div className="mt-[var(--spacing-system-xsf)] md:hidden">
|
|
96
|
+
<div className="mt-[var(--spacing-system-xsf)] content-md:hidden">
|
|
97
97
|
<ApprovalLevelDropdown
|
|
98
98
|
value={policy.approvalLevel}
|
|
99
99
|
onChange={handleChange}
|
|
@@ -102,12 +102,14 @@ const PolicyRow: FC<{
|
|
|
102
102
|
/>
|
|
103
103
|
</div>
|
|
104
104
|
) : policy.approvalLevel ? (
|
|
105
|
-
<span className="text-ods-text-primary text-h4 md:hidden">
|
|
105
|
+
<span className="text-ods-text-primary text-h4 content-md:hidden">
|
|
106
|
+
{getApprovalLevelLabel(policy.approvalLevel)}
|
|
107
|
+
</span>
|
|
106
108
|
) : null}
|
|
107
109
|
</div>
|
|
108
110
|
|
|
109
111
|
{/* Approval Level column (desktop only) */}
|
|
110
|
-
<div className="hidden shrink-0 md:block">
|
|
112
|
+
<div className="hidden shrink-0 content-md:block">
|
|
111
113
|
{editMode ? (
|
|
112
114
|
<ApprovalLevelDropdown
|
|
113
115
|
value={policy.approvalLevel}
|
|
@@ -159,7 +161,7 @@ const CategorySection: FC<{
|
|
|
159
161
|
</p>
|
|
160
162
|
<p className="text-ods-text-secondary text-h6">{category.policies.length} Configurations</p>
|
|
161
163
|
{editMode && (
|
|
162
|
-
<div className="mt-[var(--spacing-system-xsf)] md:hidden" onClick={e => e.stopPropagation()}>
|
|
164
|
+
<div className="mt-[var(--spacing-system-xsf)] content-md:hidden" onClick={e => e.stopPropagation()}>
|
|
163
165
|
<ApprovalLevelDropdown
|
|
164
166
|
value={bulkLevel}
|
|
165
167
|
onChange={handleBulkChange}
|
|
@@ -173,7 +175,7 @@ const CategorySection: FC<{
|
|
|
173
175
|
|
|
174
176
|
{/* Global Permission column (desktop only) */}
|
|
175
177
|
{editMode ? (
|
|
176
|
-
<div className="hidden shrink-0 md:block" onClick={e => e.stopPropagation()}>
|
|
178
|
+
<div className="hidden shrink-0 content-md:block" onClick={e => e.stopPropagation()}>
|
|
177
179
|
<ApprovalLevelDropdown
|
|
178
180
|
value={bulkLevel}
|
|
179
181
|
onChange={handleBulkChange}
|
|
@@ -185,7 +187,7 @@ const CategorySection: FC<{
|
|
|
185
187
|
) : (
|
|
186
188
|
<div
|
|
187
189
|
className={cn(
|
|
188
|
-
'hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] md:block',
|
|
190
|
+
'hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] content-md:block',
|
|
189
191
|
CATEGORY_LEVEL_WIDTH,
|
|
190
192
|
)}
|
|
191
193
|
/>
|
|
@@ -75,7 +75,7 @@ export function ProviderButton({ provider, onClick, disabled = false, loading =
|
|
|
75
75
|
variant="outline"
|
|
76
76
|
size="default"
|
|
77
77
|
leftIcon={isLoading ? null : <IconComponent className="h-5 w-5" />}
|
|
78
|
-
className={`h-[56px] w-full !font-bold !text-h6 hover:bg-ods-bg-hover md:!w-full ${isLoading ? 'cursor-wait' : 'cursor-pointer'} `}
|
|
78
|
+
className={`h-[56px] w-full !font-bold !text-h6 hover:bg-ods-bg-hover content-md:!w-full ${isLoading ? 'cursor-wait' : 'cursor-pointer'} `}
|
|
79
79
|
aria-label={config.displayName}
|
|
80
80
|
>
|
|
81
81
|
{isLoading ? 'Signing in...' : config.displayName}
|
|
@@ -102,7 +102,7 @@ const SectionButton: React.FC<{
|
|
|
102
102
|
isActive && activeButtonClassName,
|
|
103
103
|
layout === 'vertical'
|
|
104
104
|
? // Strip below lg: a compact, non-shrinking tab. Side list from lg: the full card.
|
|
105
|
-
'!h-auto !min-h-12 shrink-0 !px-[var(--spacing-system-mf)] !py-[var(--spacing-system-sf)] lg:!min-h-[var(--section-min-height)] lg:shrink lg:!py-[var(--spacing-system-mf)]'
|
|
105
|
+
'!h-auto !min-h-12 shrink-0 !px-[var(--spacing-system-mf)] !py-[var(--spacing-system-sf)] content-lg:!min-h-[var(--section-min-height)] content-lg:shrink content-lg:!py-[var(--spacing-system-mf)]'
|
|
106
106
|
: '!h-auto !min-h-[76px] !whitespace-normal !text-left',
|
|
107
107
|
)}
|
|
108
108
|
style={{
|
|
@@ -125,7 +125,12 @@ const SectionButton: React.FC<{
|
|
|
125
125
|
{section.number && <span className={cn(numberClasses, 'shrink-0 text-h3')}>{section.number}</span>}
|
|
126
126
|
<div className="min-w-0 flex-1 text-left">
|
|
127
127
|
<div className="flex flex-wrap items-center gap-2">
|
|
128
|
-
<p
|
|
128
|
+
<p
|
|
129
|
+
className={cn(
|
|
130
|
+
titleClasses,
|
|
131
|
+
'whitespace-nowrap text-h4 content-lg:whitespace-normal content-lg:break-words',
|
|
132
|
+
)}
|
|
133
|
+
>
|
|
129
134
|
{section.title}
|
|
130
135
|
</p>
|
|
131
136
|
{section.badge && (
|
|
@@ -137,7 +142,7 @@ const SectionButton: React.FC<{
|
|
|
137
142
|
)}
|
|
138
143
|
</div>
|
|
139
144
|
{section.description && showDescription && (
|
|
140
|
-
<p className={cn(subtitleClasses, 'mt-1 hidden whitespace-normal break-words text-h6 lg:block')}>
|
|
145
|
+
<p className={cn(subtitleClasses, 'mt-1 hidden whitespace-normal break-words text-h6 content-lg:block')}>
|
|
141
146
|
{section.description}
|
|
142
147
|
</p>
|
|
143
148
|
)}
|
|
@@ -189,8 +194,8 @@ export const SectionSelector: React.FC<SectionSelectorProps> = ({
|
|
|
189
194
|
}) => {
|
|
190
195
|
const containerClasses = cn(
|
|
191
196
|
layout === 'wrap'
|
|
192
|
-
? 'flex flex-wrap gap-2 md:gap-4 lg:gap-6'
|
|
193
|
-
: 'flex flex-row gap-[var(--spacing-system-xsf)] overflow-x-auto [scrollbar-width:none] lg:flex-col lg:overflow-visible [&::-webkit-scrollbar]:hidden',
|
|
197
|
+
? 'flex flex-wrap gap-2 content-md:gap-4 content-lg:gap-6'
|
|
198
|
+
: 'flex flex-row gap-[var(--spacing-system-xsf)] overflow-x-auto [scrollbar-width:none] content-lg:flex-col content-lg:overflow-visible [&::-webkit-scrollbar]:hidden',
|
|
194
199
|
className,
|
|
195
200
|
);
|
|
196
201
|
|
|
@@ -242,7 +247,7 @@ export const SectionSelector: React.FC<SectionSelectorProps> = ({
|
|
|
242
247
|
case 'full':
|
|
243
248
|
return 'w-full';
|
|
244
249
|
case 'responsive':
|
|
245
|
-
return 'w-full md:w-[calc(50%-8px)] lg:w-auto';
|
|
250
|
+
return 'w-full content-md:w-[calc(50%-8px)] content-lg:w-auto';
|
|
246
251
|
default:
|
|
247
252
|
return '';
|
|
248
253
|
}
|
|
@@ -47,7 +47,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
|
|
|
47
47
|
disabled={disabled}
|
|
48
48
|
onClick={onClick}
|
|
49
49
|
className={cn(
|
|
50
|
-
'group flex h-11 items-center gap-1 rounded-[6px] border px-3 py-3 transition-colors duration-200 md:h-16 md:gap-2 md:px-4',
|
|
50
|
+
'group flex h-11 items-center gap-1 rounded-[6px] border px-3 py-3 transition-colors duration-200 content-md:h-16 content-md:gap-2 content-md:px-4',
|
|
51
51
|
'w-full text-left font-body',
|
|
52
52
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus',
|
|
53
53
|
'disabled:pointer-events-none disabled:opacity-50',
|
|
@@ -63,7 +63,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
|
|
|
63
63
|
{icon && (
|
|
64
64
|
<span
|
|
65
65
|
className={cn(
|
|
66
|
-
'flex size-4 shrink-0 items-center justify-center md:size-6',
|
|
66
|
+
'flex size-4 shrink-0 items-center justify-center content-md:size-6',
|
|
67
67
|
selected ? 'text-ods-accent' : 'text-ods-text-secondary',
|
|
68
68
|
)}
|
|
69
69
|
>
|
|
@@ -91,7 +91,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
|
|
|
91
91
|
{description && (
|
|
92
92
|
<span
|
|
93
93
|
className={cn(
|
|
94
|
-
'hidden truncate text-h6 md:flex',
|
|
94
|
+
'hidden truncate text-h6 content-md:flex',
|
|
95
95
|
selected ? 'text-ods-accent' : 'text-ods-text-secondary',
|
|
96
96
|
)}
|
|
97
97
|
title={description}
|
|
@@ -103,7 +103,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
|
|
|
103
103
|
|
|
104
104
|
{tag && <Tag variant={tagVariant} className="shrink-0" label={tag} />}
|
|
105
105
|
|
|
106
|
-
{selected && <CheckCircleIcon className="size-4 shrink-0 text-ods-accent md:size-6" />}
|
|
106
|
+
{selected && <CheckCircleIcon className="size-4 shrink-0 text-ods-accent content-md:size-6" />}
|
|
107
107
|
</button>
|
|
108
108
|
);
|
|
109
109
|
},
|
|
@@ -121,7 +121,7 @@ export function SEOEditorPreview({
|
|
|
121
121
|
both columns share one label-row geometry; badges + the char counter
|
|
122
122
|
ride the label row (labelExtras / labelEnd) instead of adding stray
|
|
123
123
|
rows that misalign siblings. */}
|
|
124
|
-
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
|
|
124
|
+
<div className="grid grid-cols-1 gap-4 content-lg:grid-cols-2">
|
|
125
125
|
<div className="space-y-2">
|
|
126
126
|
<Field
|
|
127
127
|
label="SEO Title"
|
|
@@ -195,7 +195,7 @@ export function SEOEditorPreview({
|
|
|
195
195
|
</div>
|
|
196
196
|
|
|
197
197
|
{/* SEO Description & OG Image - Same Row */}
|
|
198
|
-
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
|
|
198
|
+
<div className="grid grid-cols-1 gap-4 content-lg:grid-cols-2">
|
|
199
199
|
<div className="space-y-2">
|
|
200
200
|
<Field
|
|
201
201
|
label="SEO Description"
|
|
@@ -42,9 +42,9 @@ const TAB_TRIGGER_CLASS =
|
|
|
42
42
|
|
|
43
43
|
/** Grid class for each aspect ratio (admin editors — narrower columns). */
|
|
44
44
|
export const RATIO_GRID_CLASS: Record<RatioCategory, string> = {
|
|
45
|
-
portrait: 'grid grid-cols-2 md:grid-cols-3 gap-4',
|
|
46
|
-
square: 'grid grid-cols-2 md:grid-cols-3 gap-4',
|
|
47
|
-
landscape: 'grid grid-cols-1 md:grid-cols-2 gap-4',
|
|
45
|
+
portrait: 'grid grid-cols-2 content-md:grid-cols-3 gap-4',
|
|
46
|
+
square: 'grid grid-cols-2 content-md:grid-cols-3 gap-4',
|
|
47
|
+
landscape: 'grid grid-cols-1 content-md:grid-cols-2 gap-4',
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
/** CSS `aspect-ratio` value per category — sizing for strip cards + placeholders. */
|
|
@@ -305,7 +305,7 @@ export function WaitlistForm({
|
|
|
305
305
|
disabled={isSubmitting}
|
|
306
306
|
leftIcon={<OpenFrameLogo />}
|
|
307
307
|
onClick={handleSubmit}
|
|
308
|
-
className="w-full md:w-auto"
|
|
308
|
+
className="w-full content-md:w-auto"
|
|
309
309
|
>
|
|
310
310
|
{isSuccess ? successLabel : submitLabel}
|
|
311
311
|
</Button>
|
|
@@ -277,7 +277,7 @@ export function TrustCenterPage({
|
|
|
277
277
|
})}
|
|
278
278
|
</div>
|
|
279
279
|
|
|
280
|
-
<aside className="hidden lg:block" aria-label="Trust center sections">
|
|
280
|
+
<aside className="hidden content-lg:block" aria-label="Trust center sections">
|
|
281
281
|
<div className="sticky" style={{ top: STICKY_HEADER_OFFSET_PX }}>
|
|
282
282
|
<StickySectionNav
|
|
283
283
|
sections={sections.map(section => ({ id: section.id, label: section.label }))}
|